关于javascript:学习笔记JavaScript作用域链

40次阅读

共计 825 个字符,预计需要花费 3 分钟才能阅读完成。

听小野森森的作用域链,播种颇丰。

函数在申明的时候会创立一个 js 外部的隐式属性,[[scope]],保留以后的作用域链,默认第一位是 GO。

函数在执行的时候会创立本人的 AO,保留在作用域链的第一位,之前保留的作用域往后排。

函数执行结束后,会销毁本人 AO,如果这个 AO 还保留在别的函数的作用域中,则不会被销毁。

函数再次执行,会从新创立 AO。

function a() {function b() {var b = 2;}
  var a = 1;
  b();}

var c = 3;
a();

当程序执行时,a 函数被定义,零碎为起生成 [[scope]] 属性,[[scope]]保留该函数的作用域链,该作用域链的第 0 位保留以后环境下的全局上下文 GO,GO 里存储全局下的所有对象,其中蕴含函数 a 和全局变量 c。

  • 函数执行的前一刻

b 函数被定义

b 函数被执行

b 函数执行完结时

a 函数执行完结时

练习

function a() {function b() {function c() { }
    c();}
  b();}
a();


// a 定义 a.[[scope]] -> 0 : G0
// a 执行 a.[[scope]] -> 0 : a-A0  1 : G0
// b 定义 b.[[scope]] -> 0: a-A0   1: G0
// b 执行 b.[[scope]] -> 0: b-A0   1: a-A0  2:G0
// c 定义 c.[[scope]] -> 0: b-A0   1: a-A0  2:G0
// c 执行 c.[[scope]] -> 0: c-A0   1: b-A0  2: a-A0 3:GO
// c 执行完 c.[[scope]] -> 0: b-AO  1: a-AO 2:GO
// b 执行完 b.[[scope]] -> 0: a-A0  1:G0
//                       c.[[scope]] X
// a 执行完 a.[[scope]] -> 0:G0
//       b.[[scope]] X

闭包

function test1() {function test2() {
            var b = 2;
            console.log(a);
      }
      var a = 1;
      return test2;
}

var c = 3;
var test3 = test1();

test();

正文完
 0