課程
/前端開發
/JavaScript
/人人網評論功能
為什么不能直接傳遞getStar(i)
2014-07-17
源自:人人網評論功能 7-3
正在回答
不明覺厲
這涉及到javascript中閉包,作用域,引用的概念。
// 這段代碼是錯誤的
// 每個星星節點的點擊事件
for(var i=0;i<5;i++){
? stars[i].onclick=function(){
? ? getStar(i);
? }
}
當前作用域總是能夠訪問外部作用域中的變量。
onclick函數總是能夠訪問到 window.onload 函數作用域中的變量i,
但是onclick函數沒有復制這個變量,只是引用了。
onload函數執行完后,其中的變量i沒有銷毀,因為onclick函數引用了,
但是這個時候循環已經執行完畢,i的值變成了5。
當onclick函數觸發執行時,獲取變量i的值時,自然取到的是5,而不是星星對應的序號。
解決辦法:復制一份。
!function(index) {
stars[index].onclick=function(){
getStar(index);
}(i);
利用自執行函數,將i作為參數傳入,index成為i的拷貝。
再把index放入onclick函數中即可。
更多關于閉包和作用域的知識,可參考javascript秘密花園文檔:
http://www.jb51.net/onlineread/JavaScript-Garden-CN/#function.closures
舉報
仿人人網評論,讓你的網頁活躍起來,趕快來學習讓功能的實現吧
1 回答代碼問題A A
1 回答getElementsByClassName('priaises-total') 為什么要這樣寫
1 回答e=e||window.event;//兼容 var el=e.srcElement; 這兩句啥意思
1 回答us()是什么作用,有沒有都可以
2 回答刪除節點的方法可以用別的方案嗎?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2014-12-13
不明覺厲
2014-12-07
這涉及到javascript中閉包,作用域,引用的概念。
// 這段代碼是錯誤的
// 每個星星節點的點擊事件
for(var i=0;i<5;i++){
? stars[i].onclick=function(){
? ? getStar(i);
? }
}
當前作用域總是能夠訪問外部作用域中的變量。
onclick函數總是能夠訪問到 window.onload 函數作用域中的變量i,
但是onclick函數沒有復制這個變量,只是引用了。
onload函數執行完后,其中的變量i沒有銷毀,因為onclick函數引用了,
但是這個時候循環已經執行完畢,i的值變成了5。
當onclick函數觸發執行時,獲取變量i的值時,自然取到的是5,而不是星星對應的序號。
解決辦法:復制一份。
// 每個星星節點的點擊事件
for(var i=0;i<5;i++){
!function(index) {
stars[index].onclick=function(){
getStar(index);
}
}(i);
}
利用自執行函數,將i作為參數傳入,index成為i的拷貝。
再把index放入onclick函數中即可。
更多關于閉包和作用域的知識,可參考javascript秘密花園文檔:
http://www.jb51.net/onlineread/JavaScript-Garden-CN/#function.closures