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

js中非常简单的变量泄露问题

js中非常简单的变量泄露问题

蝴蝶刀刀 2019-05-21 16:30:54
vara=[];for(vari=0;i
查看完整描述

2 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

问题源于对函数作用域(链)的理解不够深,一下是个人的一点见解,望能帮助到您:
vara=[];
for(vari=0;i<10;i++){//此处变量i为全局变量,属于外层作用域(window)
//此处声明函数,创建函数的作用域(建立作用域链,函数内部能访问外层作用域中的i变量,但此处只是声明,并不执行)
a[i]=function(){
//函数内部并未定义i变量,当函数执行时通过声明函数时建立的作用域链向上查找变量i
//调用a[6]时,for循环已经结束,变量i已经变成10,所以此处打印输出10
console.log(i);
};
}
a[6]();//10
                            
查看完整回答
1 反对 回复 2019-05-21
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

这个题已经问烂了也回答不知道多少遍了i是全局变量函数调用的时候获取i此时i已经循环到了10下面是个简单了例子可以理解为经历了两次循环
vari=1;
functiona1(){console.log(i)}
vari=2;
functiona2(){console.log(i)}
a1();//2
a2();//2
解决方法将i变为局部变量
es6
{
leti=1;
functiona1(){console.log(i)}
}
{
leti=2;
functiona2(){console.log(i)}
}
a1();//1
a2();//2
//es6let局部变量
for(leti=0;i<10;i++)...
//or
//自执行函数es5中只有函数内有局部作用域
for(vari=0;i<10;i++){
a[i]=(function(i){
returnfunction(){
console.log(i);
};
})(i)
}
                            
查看完整回答
反对 回复 2019-05-21
  • 2 回答
  • 0 关注
  • 841 浏览
慕课专栏
更多

添加回答

举报

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