我在面試過程中被問到了下面的問題,但我仍然無法理解它,所以我想徵求您的意見。Javascript關閉和自動執行匿名功能
這裏的問題:
var countFunctions = [];
for(var i = 0; i < 3; i++){
countFunctions[i] = function() {
document.getElementById('someId').innerHTML = 'count' + i;
};
}
//The below are executed in turns:
countFunctions[0]();
countFunctions[1]();
countFunctions[2]();
當被問及什麼是上面的輸出,我分別COUNT0,COUNT1和COUNT2說。很明顯,答案是錯誤的,並且輸出應該都是count3,因爲關閉的概念(當時我並不知道)。於是我通過this article去,並意識到,我應該使用閉合,使這項工作,如:
var countFunctions = [];
function setInner(i) {
return function(){
document.getElementById('someId').innerHTML = 'count' + i;
};
}
for(var i = 0; i < 3; i++){
countFunctions[i] = setInner(i);
}
//Now the output is what was intended:
countFunctions[0]();//count0
countFunctions[1]();//count1
countFunctions[2]();//count2
現在,這一切都很好,但我記得面試官用簡單的東西,使用自動執行功能類似這樣的:
var countFunctions = [];
for(var i = 0; i < 3; i++) {
countFunctions[i] = (function(){
document.getElementById('someId').innerHTML = 'count' + i;
})(i);
}
我明白上面的代碼的方式,我們跳過一個單獨的函數的聲明和簡單的調用和執行在函數中的for循環。
但是,當我跑瞭如下:
countFunctions[0];
countFunctions[1];
countFunctions[2];
它沒有工作,與被卡在COUNT2所有的輸出。
所以我試着做以下代替:
for(var i = 0; i < 3; i++) {
countFunctions[i] = function(){
document.getElementById('someId').innerHTML = 'count' + i;
};
}
,然後運行countFunctions[0]()
,countFunctions[1]()
和countFunctions[2]()
,但沒有奏效。輸出現在被卡在count3。
現在我真的不明白。我只是使用與setInner()
相同的代碼行。所以我不明白爲什麼這不起作用。事實上,我可以堅持setInner
類型的代碼結構,它可以工作,而且更全面。但是我很想知道面試官是如何做到的,以便更好地理解這個話題。
不幸的是,這似乎並沒有成爲解決辦法:http://jsfiddle.net/Kt2Xa/ – anthonytwp