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

求指点,关于闭包的作用域问题,是这样的,在执行这段代码的时候,我在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 ?

https://img2.mukewang.com/5bbd6a5f0001c36212240451.jpg

皈依舞
浏览 505回答 1
1回答

慕码人8056858

这个问题我抛开你定义的作用域,也先不考虑ES6的事情,解释一下你这个问题:&nbsp;function&nbsp;test(){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//作用域A &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;arr&nbsp;=&nbsp;[];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;j&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;i&nbsp;=&nbsp;0;i&nbsp;<&nbsp;10;i++){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arr[i]&nbsp;=&nbsp;function(){&nbsp;//作用域A的子作用域B &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;i;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log("i",i);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;a&nbsp;=&nbsp;0;a&nbsp;<&nbsp;10;a++){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(arr[a]()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;//作用域3&nbsp;全局作用域 &nbsp;&nbsp;&nbsp;&nbsp;test();这里面var i = 0这句话,实际上i的作用域在作用域A中,和j,arr一样。(for循环不能创造新的作用域。)而里面的匿名函数,是可以访问上级的作用域(也就是作用域A)中的变量i的,所以最后打印出来的肯定都是上级的i,即最后的10关于匿名函数作用域中的j,实际上根本没有这个变量(因为没有声明,也没有“继承”),个人见解...研究好后再来修改答案test();这句话,运行的时候是在作用域A中,console.log(arr[a]());而这句话运行的时候是在匿名函数的作用域中(作用域A的子作用域B)你这段小代码里面,并没有涉及到全局作用域访问局部作用域变量的事情
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript