作用域:就是起作用的区域。JS的作用域规定了变量和函数可访问的范围。
JS作用域分为:全局作用域和局部作用域
- 全局作用域:定义在外部的函数、定义在所有函数外部的变量、没有用var定义申明的变量和直接定义在window下的属性。均属于全局作用域下。
- 局部作用域:c/c++的局部作用域主要是块级作用域,就是{}内就是一个作用域,JS不存在块级作用域,主要是函数作用域。函数内定义的变量均属于函数作用域内,函数执行完成后,变量销毁。
函数的作用域体现在定义函数时的环境而不是执行函数的环境。
函数中有一个[[scope]]属性,该属性包含了函数的作用域链scope-chain
函数在被创建的时候把创建时的环境加入到scope-chain中。
函数调用时会生成一个活动对象,将函数的形参作为活动对象的同名属性,并将活动对象置于scope-chain的最前端。
每次发生变量的调用,函数的调用都会进行作用域链查询。
例子:
var name = "window";
function echo = function(){
alert(name);
}
function eve = function(){
var name = "eve";
echo();
}
eve();
解释:函数定义时:
-
echo的scope-chain
[
{window}
] eve的scope-chain
[
{window}
]
eve调用时:
- eve的scope-chain
[
{name="eve"},
{widow}
]
调用echo时:
- echo的scope-chain
[
{},
{widow}
]
ehco调用alert时在作用域链上寻找name,寻找到的是window中的name。