您的位置:首页 > Web前端 > JavaScript

[2017-01-26]JavaScript执行环境及作用域

2017-01-31 17:53 302 查看

执行环境(execution context)

> 执行环境定义了变量或函数有权访问的其他数据,决定了他们的各自行为。每个执行环境都有一个与之关联的变量对象(variable > object),环境中定义的所有变量和函数都保存在这个对象中。虽然我们编写的代码无法访问这个对象,但是解析器在处理数据时会在后台使用它。

在javacript中执行环境分为全局环境局部环境。整个页面里被共享的方法和属性是全局环境。相对于全局环境,函数号里的执行环境就是局部环境。

1. 全局环境 全局环境是最外围的一个执行环境。在web浏览器中,全局执行环境被认为是window对象。因此,所有的全局变量和函数都是作为window对象的属性和方法创建的。某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁(全局执行环境直到应用程序退出,例如关闭网页或浏览器时才会被销毁)

作用域

javascript作用域决定了哪些变量能被函数访问(作用域是函数的内部属性,谈到作用域是离不开function的)作用域也确定了this指针的指向

块级作用域(大多数类C语言都拥有块级作用域,JS却没有。) 任何一对花括号({和})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。

//C语言
#include <stdio.h>
void main()
{
int i=2;
i--;
if(i)
{
int j=3;
}
printf("%d/n",j);
}
//output:use an undefined variable:j


C语言拥有块级作用域,因为j是在if的语句块中定义的,因此,它在块外是无法访问的。

//javascript
functin test(){
for(var i=0;i<3;i++){
}
alert(i);
}
test();

//output:3


在块外,块中定义的变量i仍然是可以访问的。也就是说,JS并不支持块级作用域,它只支持函数作用域,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都是可见的。

大多数类C语言都拥有块级作用域,JS却没有。但可以在函数中定义变量,模拟js有块级作用域

var i=10;
function a() {
alert(i);
};
a();

//output:10


var i=10;
function a() {
alert(i);
var i= 3;
};
a();

//output:undefined


> 用域链图中很明确的表示出:在变量解析过程中首先查找局部的作用域,然后查找上层作用域。在代码一的函数当中没有定义变量i,于是查找上层作用域(全局作用域),进而进行输出其值。但是在代码二的函数内定义了变量i(无论是在alter之后还是之前定义变量,都认为在此作用域拥有变量i),于是不再向上层的作用域进行查找,直接输出i。但是不幸的是此时的局部变量i并没有赋值,所以输出的是undefined。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: