求指点,关于闭包的作用域问题,是这样的,在执行这段代码的时候,我在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)
你这段小代码里面,并没有涉及到全局作用域访问局部作用域变量的事情
添加回答
举报
0/150
提交
取消