@TryLoveCatch
2016-11-08T14:57:44.000000Z
字数 564
阅读 1304
javascript核心概念
词法作用域就是定义在词法阶段的作用域,是由写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变。
也就是说,无论函数在哪里被调用,也无论它如何被调用,它的词法作用域都只由函数被声明时所处的位置决定。
举个例子
var a = 20;
function foo () {
console.log(a);
}
foo(); // 20
function bar () {
var a = 30;
foo(); // 20
}
bar();
这个例子就是一个很好的印证,可以发现的是,无论foo在哪里调用,其a的值永远是全局作用域中的a的值,这就是词法作用域,定义函数时,作用域是在全局,那么foo上层作用域就是全局,改变其调用位置是不能改变其作用域链的,其作用域链是在定义时就决定好的。
作用域也可以改变,javascript里面提供eval和with可以来改变作用域,但是不提倡使用,这里就略过不提了。
其实,函数在创建的时候,其作用域[[scope]]就已经创建了,不是在执行的时候,因为函数创建后可能永远不执行,但是作用域是始终存在的,函数执行的时候,函数的活动对象创建,并添加到函数作用域链的最前方,和[[scope]]构成了函数的作用域链,并不会改变[[scope]]的值。