JavaScript中变量、执行环境、作用域与C#中的异同
首先需要明确一个执行环境的概念,执行环境这个概念是用来理解作用域的,在js中,执行环境分为全局执行环境和局部(function)执行环境,而在C#这类的C类语言中,还有一个块级别的执行环境,如if语句、for语句所形成的花括号包围起来的块。
然后就是需要理解一个关键字:var,var这个关键字在js中是用来创建一个局部变量的,使用var创建的局部变量会保存在最接近的作用域中。比如,在function中var person=new Object();就会在函数域中定义一个局部变量,这个局部变量会被放到function作用域链的前端。
执行环境:执行环境是js中最为重要的一个概念,它定义了变量或者函数有权访问的其他数据。执行环境都有一个变量对象与之进行对应,对于这一点,我的理解是因为js中没有像其他面向对象的语言可以来定义一个class,所以,在js中,执行环境对应的变量对象就是相当于在C#等语言中定义的一个class。而js中的执行环境都是固定的,比如在网页上面执行的话这个变量对象就是window(window class),在控制台上面执行的话就是console(console class)。更近一步的,在相应的执行环境中定义的属性和函数也都是作为这个执行环境的变量对象的属性和函数来进行保存的。
每个函数都有自己的执行环境(局部的),在js中存在一种这样的机制:当执行流进入一个函数中时,会将这个函数推入一个执行栈,而当函数执行完毕后会从执行栈弹出。利用这种机制来灵活的控制js的执行流。当代码在特定的环境中执行时,会创建变量对象的一个作用域链,这个作用域链的作用时保证代码的访问权限(有序访问)。作用域链的最前端始终都是当前环境的对象变量。如果这个环境是函数,那么在这个执行环境的变量对象的作用域链的最前端就是这个函数中的活动对象,活动对象最开始时只包含一个arguments。(argument是一个数组用来存放function所接受的实参。可以通过arguments[]来访问function所接受的所有实参。也可以用arguments.length来查看传入实参的个数。)作用域链上的下一个变量对象则是当前执行环境的包含环境,按照这样的排列逐渐扩大,最后到全局执行环境。
看一个例子:
var color = "blue";
function changeColor()
{
if (color === "blue")
{
color = "red";
}
else
{
color = "blue";
}
}
changeColor();
alert("color is now "+color);
函数changeColor()的作用域链上包含两个变量对象,自身的arguments变量对象以及全局的color。可以在内部访问到color,就是因为可以在作用域链上能够找到它。
此外,由于没有块级作用域的支持,可能会出现如下让人难以理解的例子:
var color = "blue";
function changeColor()
{
if (true)
{
var person="a";
}
alert(person);
}
changeColor();
alert("color is now "+color);
在if条件语句中定义一个局部的变量,可以在if外面访问到!这是因为在function内部任何部位定义的变量是在function这个执行环境的变量对象的作用域链上对该变量进行了添加,所以在这个执行环境的任何地方都可以对这个变量进行访问。
JavaScript中变量、执行环境、作用域与C#中的异同的更多相关文章
- 【JS】JavaScript中的执行环境与作用域
JavaScript中的执行环境定义了变量或函数有权访问的数据(每个函数都有自己的执行环境),全局执行环境是最外围的执行环境,在浏览器中,全局执行环境就是window对象,所以所有的全局变量和函数都是 ...
- JavaScript语言精粹--执行环境及作用域,this
1.执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为. 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中. 虽然我们无法访问,但是解析器在处理数据时 ...
- Javascript高级程序设计——执行环境与作用域
Javascript中执行环境是定义了变量或函数有权访问的其他数据,决定了各自的行为,每个执行的环境都有一个与之关联的变量对象,环境中定义的所以变量和函数都保存在这个对象中. 全局执行环境是最外围的一 ...
- js中的执行环境及作用域
最近在面试时被问到了对作用域链的理解,感觉当时回答的不是很好,今天就来说说js中的作用域链吧. 首先来说说js中的执行环境,所谓执行环境(有时也称环境)它是JavaScript中最为重要的一个概念.执 ...
- JavaScript:理解执行环境、作用域链和活动对象
作用域的原理,对JS将如何解析标识符做出了解答.而作用域的形成与执行环境和活动对象紧密相关. 我们对于JS标识符解析的判断,存在一个常见误区 首先,看一个关于JS标识符解析的问题 ,源于风雪之隅提出的 ...
- javascript基础进阶——执行环境及作用域链
概念 执行环境 执行环境定义了变量或函数有权访问的其他函数,决定了他们各自的行为.每个执行环境都有一个与之关联的变量对象. 变量对象 环境中定义的所有变量和函数都保存在这个对象中. 全局执行环境 全局 ...
- Javascript 函数及其执行环境和作用域
函数在javascript中可以说是一等公民,也是最有意思的事情,javascript函数其实也是一个对象,是Function类型的实例.因此声明一个函数首先可以使用 Function构造函数: va ...
- js中的执行环境和作用域链
首先介绍一些即将用到的概念: 执行环境: 它定义了变量和函数有权访问其他数据的范围,每一个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个变量对象中. 所有javasc ...
- javascript学习笔记 - 执行环境及作用域
一 执行环境(环境) 1.每个执行环境都有一个关联的全局变量对象.例如:web浏览器中,window对象为全局变量对象.环境中定义的所有变量和函数都保存在该对象中.全局执行环境是最外围的环境. 2.执 ...
- JS中的执行环境和作用域
window 是最大最外围的执行环境,然后每个函数都有自己的执行环境.JS代码是从上到下执行的,单纯的用语言描述可能会有点绕,而且不大直观.我们看着代码来 console.log('global be ...
随机推荐
- vuejs2+webpack2+vuxui2多页面架手脚,支持二级目录
const UglifyJsPlugin = require('uglifyjs-webpack-plugin') // 去console插件 const CompressionWebpackPlug ...
- 如何学习Linux性能优化?
如何学习Linux性能优化? 你是否也曾跟我一样,看了很多书.学了很多 Linux 性能工具,但在面对 Linux 性能问题时,还是束手无策?实际上,性能分析和优化始终是大多数软件工程师的一个痛点.但 ...
- centos 6.9修改系统默认字符集
[root@ckh ~]# locale –a #列出系统所支持的所有字符集 aa_DJ aa_DJ.iso88591 aa_DJ.utf8 aa_ER aa_ER@saaho aa_ER.utf8 ...
- Luogu2792 [JSOI2008]小店购物
Luogu2792 [JSOI2008]小店购物 重题 bzoj4349 最小树形图 有 \(n\) 个物品,每个物品有价格 \(c_i\) 和所需个数 \(k_i\) ,所有物品必须恰好买 \(k_ ...
- python中如何对待易过期的cookies
有时候,我们进行爬虫操作是,会使用reques的的post函数携带cookies访问目标网站已达到登录或者其他 目的,笔者最近就遇到了这样的案例,周六写好的代码,周一过来就不行了,重新登录访问目标网页 ...
- bsxfun, arrayfun, cellfun, spfun, structfun
在使用matlab进行矩阵计算的时候,经常会遇到要使用for循环的情况.但其实很多操作可以用内部的一些函数代替.今天总结一些几个函数的用法: bsxfun, arrayfun, cellfun, sp ...
- 理解 vue-router的beforeEach无限循环的问题
在理解beforeEach无限循环之前,我们先来看一下beforeEach相关的知识点,该篇文章的项目是基于 express+vue+mongodb+session实现注册登录 这篇文章项目基础之上进 ...
- Linux VNC安装
cat /etc/centos-release CentOS Linux release 7.4.1708 (Core) uname -r 3.10.0-693.el7.x86_64 VNC下载:ht ...
- Intellij Idea 2017创建web项目及tomcat部署实战
相关软件:Intellij Idea2017.jdk16.tomcat7 Intellij Idea直接安装(可根据需要选择自己设置的安装目录),jdk使用1.6/1.7/1.8都可以,主要是配置好系 ...
- devops工具-Ansible进阶playbook&roles
一.playbook介绍 playbook 是 Ansible 管理配置.部署应用的核心所在,一个playbook由有多“play组成”,而一个play实际就是一个task,每个task是由多 ...