[关闭]
@TryLoveCatch 2016-11-08T14:57:44.000000Z 字数 564 阅读 1304

JavaScript核心概念之词法作用域

javascript核心概念


  词法作用域就是定义在词法阶段的作用域,是由写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变。

  也就是说,无论函数在哪里被调用,也无论它如何被调用,它的词法作用域都只由函数被声明时所处的位置决定。
  举个例子

  1. var a = 20;
  2. function foo () {
  3. console.log(a);
  4. }
  5. foo(); // 20
  6. function bar () {
  7. var a = 30;
  8. foo(); // 20
  9. }
  10. bar();

  这个例子就是一个很好的印证,可以发现的是,无论foo在哪里调用,其a的值永远是全局作用域中的a的值,这就是词法作用域,定义函数时,作用域是在全局,那么foo上层作用域就是全局,改变其调用位置是不能改变其作用域链的,其作用域链是在定义时就决定好的。

改变作用域

  作用域也可以改变,javascript里面提供eval和with可以来改变作用域,但是不提倡使用,这里就略过不提了。

  其实,函数在创建的时候,其作用域[[scope]]就已经创建了,不是在执行的时候,因为函数创建后可能永远不执行,但是作用域是始终存在的,函数执行的时候,函数的活动对象创建,并添加到函数作用域链的最前方,和[[scope]]构成了函数的作用域链,并不会改变[[scope]]的值。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注