4,作用域闭包

2020-08-07  本文已影响0人  r8HZGEmq
var data=[];
for(var i=0; i<3; i++){
    data[i] = function(){ console.log(i); }
}
data[1]();
没有块级作用域

因为data数组中存了3个function,每个function执行时,需要用到i,但是自己的作用域内没有,
向上查找【AO,globalContext.VO】所以都为3.

但是如果改成let i......(块级作用域)
或者
包装成自执行函数 【AO,匿名函数的AO,globalContext.VO】
data[i]=(....)(i)  function(i){return function(){ 打印i }}
作用域虽然pop了,但是作用域链的对象被依赖了,所以还在
闭包:红宝书P178:有权访问另外一个函数作用域中的变量的函数

var myCounter1 = createCounter(100);
var myCounter2 = createCounter(200);

function createCounter(val){
  var counter = val;  闭包-存储私有变量
  function increment(value){ counter += value}
  function get(){ return counter; }
  return {increment, get}
}
会创建2个不同的作用域scope对象:myCounter1 和 myCounter2

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}

var foo = checkscope(); foo指向函数f
foo();                  调用函数f()

步骤:
1,创建全局context,压入堆栈,初始化(this、变量、原型链等)
2,创建checkscope的context,压栈,初始化。执行完毕,弹出。
3,创f,压栈,init,exec,pop

问题来了:
为什么2弹出了,3依赖2的变量还能访问到
3维持着一个作用域链数组内有2的活跃对象,即使context2弹出但js继续维持着context2

上一篇 下一篇

猜你喜欢

热点阅读