for 迴圈中的 i 變數取值問題

2022-04-09 01:52:34 字數 1517 閱讀 1827

1:如何點選某乙個 li 的時候 alert 輸出其index?

window.onload = function()}}

解析:因為在for迴圈裡面指定給olis[i].onclick的事件處理程式,也就是onclick那個匿名函式是在for迴圈執行完成後(使用者點選時)才被呼叫的。而呼叫時,需要對變數i求值,解析程式首先會在事件處理程式內部查詢,但i沒有定義,然後又到方法外部查詢,此時有定義,但i的值是4(只有i大於4才會停止執行for迴圈),因此,就會取到該值——這正是閉包(匿名函式)要使用其外部作用域中變數的結果。而且,這也是由於匿名函式本身無法傳遞引數(故而無法維護自己的作用域)造成的.(比較囉嗦,可以看下面的解釋)

其實是根據作用域鏈的原理,在這個函式裡面的i其實引用的是最後一次i的值,為什麼不是0,1,2,3,...呢?因為在你for迴圈的時候,你並沒有執行這個函式,你這個函式是在你點選的時候才執行的,當執行這個函式的時候,它發現它自己沒有這個變數i,於是向它的作用域鏈中查詢這個變數i,因為當你單擊這個box的時候已經for迴圈完了,所以儲存在作用域鏈裡面的i的值就是4,最後就彈出出來4了。

2:解決辦法:將每次for迴圈中的變數i儲存到某個地方;

方法一:

window.onload = function()

})(i);}}

解釋:成功列印每個 i 的值,原理就是通過自執行函式,將變數i儲存到這個自執行函式的引數中。

方法二:

window.onload = function()}}

解釋:將每次迴圈得到的i,賦值給olis[i]物件的index屬性,在通過this指向,取出點選當前物件的index的值。

方法三:

window.onload = function()

})(i);}}

解釋:3:解決辦法:讓這個函式直接執行;

window.onload = function()}}

解釋:雖然這樣可以列印出每次變數i的值,但是我們沒有點選li的時候他已經執行完了,也就是說,這個點選事件已經可有可無了,所以我們這種方法在繫結事件中不可用。

4:es6為我們新增了,定義變數的關鍵字 let

window.onload = function()}}

解釋:let允許宣告乙個作用域被限制在塊級中的變數、語句或者表示式。與var關鍵字不同的是,它宣告的變數只能是全域性或者整個函式塊的。

let的幾點用法:

1>用於宣告變數,不做變數提公升;

2>在同乙個作用域中,不允許重複宣告同乙個變數;

3>會產生塊級作用域;

4>特殊注意:for迴圈是乙個塊級作用域,for後{}是乙個塊級作用域,for塊級作用域是for{}塊級作用域的父級作用域。

for(let i = 0;i < 5;i++,console.log( i ))

alert(i);//報錯

迴圈執行了幾次,就存幾個塊級作用域,每乙個塊級作用域都有乙個變數 i ,但是這幾個i不是同乙個i 。(函式內部的變數i 與 迴圈變數i 不在同乙個作用域,有各自單獨的作用域)

for迴圈中 i和i 的效率問題

不知道你是否聽說過 i比i 快的說法,真的如此嗎?這兩個表示式從我們初學程式語言的時候就會接觸到。前者是自增後取值,後者是取值後自增。我們看乙個簡單的例子。include using namespace std intmain 執行結果 c 0 d 1對於這個結果我們並不感到意外。另外我們還注意到另...

for迴圈中的i 與 i

今天遇到乙個for迴圈 for i 1 i 1 i 其中使用的是 i,我以為 i會先於判斷執行,就上網找了找i 與 i的區別。答案很少,有乙個說的是效率後者高一些。然後我又寫了乙個測試的 var j 0 for i 1 i 1 i,j console.log console.log i,j 發現 是...

for迴圈中 i和i 的區別

語法 for 語句1 語句2 語句3 語句 1 在迴圈 塊 開始前執行 語句 2 定義執行迴圈 塊 的條件 語句 3 在迴圈 塊 已被執行之後執行 這就是迴圈中的 i和i 結果一樣的原因,但是效能不一樣,稍後解釋 語句1 同上面語法中的 語句1 語句1 是可選的,也就是說不使用語句1 也可以。var...