JS中只有函数级别的作用域,没有块级别的作用域;换句话说,只有在进入或者退出函数的时候,作用域会发生变化。
函数的作用域:外部对内部可见;内部对外部不可见;内部优先;
一. 外部对内部可见
且看以下代码,浏览器会输出什么呢?
var scope = 'g';
function t(){
console.log(scope);
var scope = 'l';
console.log(scope);
}
t();
结合预编译的知识可以知道,浏览器依次输出“undefined”、“l”,前面输出undefined主要是因为在函数内部对scope这个变量有定义,但是若函数里面不存在这条定义,会怎么输出呢?
var scope = 'g';
function t(){
console.log(scope);
console.log(scope);
}
t();
这样的话,输出都为“g”
二. 内部对外部不可见
且看以下代码,浏览器会报错:
function t(){
var scope = 'l';
}
t();
console.log(scope)
三. 都可见时,内部优先
var scope = 'g';
function t(){
console.log(scope);
var scope = 'l';
console.log(scope);
}
t();
该段代码与第一段重复,但同样可以说明问题。
执行环境(execution context),定义了执行期间可以访问的变量和函数。
- 全局执行环境
- Global Object(window)
- 从见到JS代码开始创建
- 到网页关闭时销毁
- 函数执行环境
- Activation Object
- 从函数调用开始创建
- 到函数调用结束时销毁
作用域链
- 作用域[[scope]]和作用域链,每个函数都有。
- 作用域是私有属性,只能由JS引擎访问
- 作用域链,是AO和GO构成的链
- 所谓执行环境,就是根据作用域链依次查找变量和函数:找到即停,全部找完无果,报错。
网友评论