for(var i=1;i<=5;i++){ setTimeout(function timer(){ alert(i); },i*1000);}在《你不知道的javascript》中,是這么描述這段代碼的:缺陷是我們試圖假設(shè)循環(huán)中的每個(gè)迭代在運(yùn)行時(shí)都給自己"捕獲"一個(gè)i的副本。但是根據(jù)作用域的工作原理,實(shí)際情況是盡管循環(huán)中的五個(gè)函數(shù)是在各個(gè)迭代中分別定義的,但是它們都被封閉在一個(gè)共享的全局作用域中,因此實(shí)際上只有一個(gè)i.疑問:只有一個(gè)i(為啥i是6)?能不能這么理解?在函數(shù)的5次迭代中,每一次在迭代運(yùn)行時(shí)都給自己捕獲了一個(gè)i的副本。i排序也就是1,2,3,4,5,6;但是,又根據(jù)作用域的工作原理(詞法作用域的查找規(guī)則),這6個(gè)i中只能是其中一個(gè)i,最后根據(jù)i所出現(xiàn)的順序的先后,6是出現(xiàn)在排序中的最末位,所以這唯一一個(gè)i就是6.
《你不知道的javascript》循環(huán)和閉包的案例
長風(fēng)秋雁
2018-10-20 14:11:41