亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

跪求!關于JavaScript中for語句的引用問題

跪求!關于JavaScript中for語句的引用問題

慕容708150 2019-10-25 20:56:59
原貼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 回答

?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

閉包與變量提升問題。
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-25
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

典型的變量提升問題。for循環結束后所有用到的i變量都會被替換成最后一次循環的值
如果你把post2屬性定義在post3后面:
{
post3:Function,
post2:Function,
}
你看到的結果將是三個'post2'
                            
查看完整回答
反對 回復 2019-10-25
  • 2 回答
  • 0 關注
  • 227 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號