美文网首页
4,作用域闭包

4,作用域闭包

作者: r8HZGEmq | 来源:发表于2020-08-07 16:45 被阅读0次
    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
    
    

    相关文章

      网友评论

          本文标题:4,作用域闭包

          本文链接:https://www.haomeiwen.com/subject/owmfdktx.html