1.index是屬性,實際上屬性就是某個物件的專屬變數。不知道你聽過名稱空間這個概念沒有:實踐中為了降低專案中出現變數名稱衝突的機率,我們會在JS全域性環境中只宣告一個全域性變數,然後在這個變數下面新增和命名相應的屬性來儲存你想儲存的值。這種方式的好處就是不用使用var關鍵字來宣告變數,只用在需要的時候直接在全域性變數後面新增一個新的屬性就行了。2.這個問題中,事件處理函式是註冊在child上面的,等你在將來觸發這個事件的時候就相當於執行了child.handlerfunction(),因此this在此時指代的是child,因此this.index也就是child.index,也就對應逆迴圈的時候儲存的那個時刻的i值。3.同第二個問題,這裡的this在觸發函式事件的時候也是指的child。如果你真的在看JS語言精粹,你可以去看第28頁方法呼叫模式,裡面提到:一個函式在作為某個物件的方法被呼叫時,this才會被繫結到呼叫該方法的物件。從這裡作者提出this的繫結具有延遲性,我個人理解的是,與其說是延遲性,不如說是即時性。this不是一個常規的物件,你可以把它看成是一個即時的指標,可能上一秒在函式A中指代某個物件,下一秒又會跑到函式B中指代另一個物件,從而保證了this的高度複用。這也是JS引入this的初衷,它給與了JS強大而靈活的引用特性。4.這個問題我之前回答過,傳送門稍後。我仍然要說的就是,寫程式的時候一定要分清程式碼層級,也就是要清楚哪一層程式碼在當前只是被定義,哪一層程式碼是正在被執行。你的例子中,window.onload在頁面載入時就會被執行,因此函式內的第一層程式碼會被執行,oUl[i] 中的 i 就是第一層被執行的程式碼,此時的 i 會被替換為每次迭代中 i 的實際值。你說的 i 為定值的情況也是存在的,如果你在oUl[i]中的事件處理函式內直接書寫 i ,那麼在將來觸發事件函式的時候 i 就是迴圈結束後的值+1,因為在執行window.onload的時候oUl[i]的事件處理函式中的 i 只是一個字面符號,並未被執行,也就不會被替換為每次迭代時 i 的實際值。更具體原因參見這個回答:js關於for迴圈中的閉包問題? - 閉家鎖的回答
1.index是屬性,實際上屬性就是某個物件的專屬變數。不知道你聽過名稱空間這個概念沒有:實踐中為了降低專案中出現變數名稱衝突的機率,我們會在JS全域性環境中只宣告一個全域性變數,然後在這個變數下面新增和命名相應的屬性來儲存你想儲存的值。這種方式的好處就是不用使用var關鍵字來宣告變數,只用在需要的時候直接在全域性變數後面新增一個新的屬性就行了。2.這個問題中,事件處理函式是註冊在child上面的,等你在將來觸發這個事件的時候就相當於執行了child.handlerfunction(),因此this在此時指代的是child,因此this.index也就是child.index,也就對應逆迴圈的時候儲存的那個時刻的i值。3.同第二個問題,這裡的this在觸發函式事件的時候也是指的child。如果你真的在看JS語言精粹,你可以去看第28頁方法呼叫模式,裡面提到:一個函式在作為某個物件的方法被呼叫時,this才會被繫結到呼叫該方法的物件。從這裡作者提出this的繫結具有延遲性,我個人理解的是,與其說是延遲性,不如說是即時性。this不是一個常規的物件,你可以把它看成是一個即時的指標,可能上一秒在函式A中指代某個物件,下一秒又會跑到函式B中指代另一個物件,從而保證了this的高度複用。這也是JS引入this的初衷,它給與了JS強大而靈活的引用特性。4.這個問題我之前回答過,傳送門稍後。我仍然要說的就是,寫程式的時候一定要分清程式碼層級,也就是要清楚哪一層程式碼在當前只是被定義,哪一層程式碼是正在被執行。你的例子中,window.onload在頁面載入時就會被執行,因此函式內的第一層程式碼會被執行,oUl[i] 中的 i 就是第一層被執行的程式碼,此時的 i 會被替換為每次迭代中 i 的實際值。你說的 i 為定值的情況也是存在的,如果你在oUl[i]中的事件處理函式內直接書寫 i ,那麼在將來觸發事件函式的時候 i 就是迴圈結束後的值+1,因為在執行window.onload的時候oUl[i]的事件處理函式中的 i 只是一個字面符號,並未被執行,也就不會被替換為每次迭代時 i 的實際值。更具體原因參見這個回答:js關於for迴圈中的閉包問題? - 閉家鎖的回答