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

关于JavaScript中for语句的引用问题

关于JavaScript中for语句的引用问题

互换的青春 2019-10-16 09:17:44
原贴JavaScript,为什么此处没有异步也需要用闭包今天闲来无事重写了这个方法.大概意思就是根据属性名判断是否是post开头,如果是的话将这个属性对应的方法进行改写,先进行一个随机数判断再决定是否执行原方法。正确的写法是用匿名函数或者let之前的帖子中如果我舍弃用匿名函数的话(也就是错误写法),只有post3这个属性会被改写,因为i和func的指向都是最后一次for中i的值,所以被覆盖了。但是这一次我的代码中3个方法都被改写成了post3的方法,obj[i]并没有被覆盖。让我觉得非常疑惑。为什么两次相同的代码结果会不一样。varobj={post1:function(){console.log('post1')},post2:function(){console.log('post2')},post3:function(){console.log('post3')},check:function(){returnMath.random()>0.5}}functionchangeFunc(obj){for(variinobj){if(i.indexOf('post')==0&&typeofobj[i]=='function'){varfunc=obj[i]obj[i]=function(){if(obj.check()){func.apply(this,arguments)}}}}}changeFunc(obj)obj.post1()obj.post2()obj.post3()结果是随机输出0-3个'post3',这是为啥呢==
查看完整描述

2 回答

?
隔江千里

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

闭包与变量提升问题。
functionchangeFunc(obj){
for(variinobj){
if(i.indexOf('post')==0&&typeofobj[i]=='function'){
//=========================
varfunc=obj[i]
obj[i]=function(){
if(obj.check()){
func.apply(this,arguments)
}
}
}
}
}
上面代码中变量func使用var定义的,会被提升到函数开头,所以你重写的三个函数都是公用同一个变量func,调用的肯定也是同一个函数,即遍历中最后满足条件的函数。
将var改为let就没问题了,let定义的变量不会提升。
                            
查看完整回答
反对 回复 2019-10-16
?
米琪卡哇伊

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

典型的变量提升问题。for循环结束后所有用到的i变量都会被替换成最后一次循环的值
如果你把post2属性定义在post3后面:
{
post3:Function,
post2:Function,
}
你看到的结果将是三个'post2'
                            
查看完整回答
反对 回复 2019-10-16
  • 2 回答
  • 0 关注
  • 378 浏览
慕课专栏
更多

添加回答

举报

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