为了账号安全,请及时绑定邮箱和手机立即绑定

javascript 匿名函数创建闭包是js引擎是怎么处理的?

javascript 匿名函数创建闭包是js引擎是怎么处理的?

皈依舞 2018-09-14 09:09:50
求指点,关于闭包的作用域问题,是这样的,在执行这段代码的时候,我在google上监测变量,发现一个问题,for(var a = 0;a < 10;a++){     console.log(arr[a]());}在下面这个闭包(作用域2)被调用的时候可以访问到他的包含作用域test(作用域1)的变量i以及全局作用域(作用域3),但是如果直接在运行时访问变量j的话是访问不到的,js引擎在解析到闭包中i变量的时候发生了什么事情,function (){return i;}<script>function test(){    //1 块作用域1 变量 i,arr    var arr = [];    var j = 0;    for(var i = 0;i < 10;i++){        //arr[i] 存储的是匿名方法的引用,没有立刻执行        arr[i] = function(){ //作用域2            return i; //breakpoint        };    }    // i = 10 arr[i] = function(){return i;}    for(var a = 0;a < 10;a++){        console.log(arr[a]());    }}//作用域3 全局作用域test()var k =1;    </script>Q:执行作用域3的时候为什么能访问到作用域2(test 作用域)中的 i,   作用域1(全局作用域)中的k,为什么不能访问到作用域2中的j ?
查看完整描述

1 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

这个问题我抛开你定义的作用域,也先不考虑ES6的事情,解释一下你这个问题:

 function test(){        //作用域A
        var arr = [];        var j = 0;        for(var i = 0;i < 10;i++){
            arr[i] = function(){ //作用域A的子作用域B
                return i; 
            };
        }        console.log("i",i);      
        for(var a = 0;a < 10;a++){            console.log(arr[a]());
        }
    }    //作用域3 全局作用域
    test();

这里面var i = 0这句话,实际上i的作用域在作用域A中,和j,arr一样。

(for循环不能创造新的作用域。)

而里面的匿名函数,是可以访问上级的作用域(也就是作用域A)中的变量i的,所以最后打印出来的肯定都是上级的i,即最后的10

关于匿名函数作用域中的j,实际上根本没有这个变量(因为没有声明,也没有“继承”),个人见解...研究好后再来修改答案

test();这句话,运行的时候是在作用域A中,console.log(arr[a]());而这句话运行的时候是在匿名函数的作用域中(作用域A的子作用域B)

你这段小代码里面,并没有涉及到全局作用域访问局部作用域变量的事情


查看完整回答
反对 回复 2018-10-10
  • 1 回答
  • 0 关注
  • 504 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信