javascript - js閉包作用域
問題描述
為什么會輸出10 次10 push進(jìn)去的不應(yīng)該是 1 - 9嗎 這個坑求大神解答
function save_i(){ var a = []; for(var i = 0;i<10;i++){a[i] = function(){ return i;} } return a; }var c = save_i();for(var i = 0;i<10;i++){ console.log(c[i]()); //10次 10}
問題解答
回答1:只需要在for循環(huán)執(zhí)行時,創(chuàng)建一個閉包函數(shù)將i值保存起來,既可以依次輸出
function save_i(){ var a = []; for(var i = 0;i<10;i++){a[i] = function(i){ return function() {return i; };}(i); } return a;}var c = save_i();for(var i = 0;i<10;i++){ console.log(c[i]()); //已經(jīng)變?yōu)橐来屋敵鰙回答2:
在執(zhí)行點(diǎn)擊事件之前,for循環(huán)已經(jīng)執(zhí)行完,也就是最終獲取的是最后 i 的值5。 呆神:綁定 和 點(diǎn)擊 是兩個事件 點(diǎn)擊是用戶交互的時候發(fā)生 綁定在引擎編譯代碼的時候就發(fā)生了~ 宇神:這樣理解吧,你把點(diǎn)擊事件當(dāng)做一個下車事件,而火車從1-4,到4時你才能下車執(zhí)行事件,此時值為4.
之前過基礎(chǔ)看過的文章理解閉包,要求你寫過一代碼,而且接下來在自己的代碼中也能用到,除些之外,就只能死記硬背了。老派的國人喜歡讓小孩子很小的時候背東西,但是不會和他們講是什么意思,有時也講不清,寄希望于在未來的某個時刻自然而然就懂了以上如果你有一定基礎(chǔ),推薦看我寫的日志,再不懂,留言問我http://user.qzone.qq.com/2084...
回答3:function save_i(){ var a = []; for(var i = 0;i<10;i++){a[i] = function(i){ return i;}; } return a; }var c = save_i();for(var i = 0;i<10;i++){ console.log(c[i](i));}回答4:
a[i] = function(i){ return i;};
return的每個i都是引用了外部的同一個i 也就是10
回答5:var fns=[];function test(){ for(var i=0;i<10;i++){(function(j){ fns.push(function(){ console.log(j);} ); })(i); }}test();for(var k=0;k<fns.length;k++){ fns[k]();}
var變量的作用域是函數(shù)作用域,不是塊級作用域
回答6:作用域鏈在創(chuàng)建的時候就已經(jīng)生成了, c[i] = function(i){ return i; };運(yùn)行的時候當(dāng)前作用域沒有i,而上層作用域save_i()的i已經(jīng)變成10。你認(rèn)為結(jié)果是0~9,是不是你把上層作用域當(dāng)做全局了
回答7:a[i]賦值的時候是一堆function、也就是并沒有執(zhí)行、也沒有拿到i、她的作用域也沒取到i
當(dāng)你在下面執(zhí)行的時候、這一堆function都開始找自己作用域能取到的i、也就是循環(huán)執(zhí)行完的10
回答8:var關(guān)鍵字聲明變量作用域?yàn)楹瘮?shù)作用域, 因此 for 循環(huán)中的 i 變量會發(fā)生變量提升。 樓主的將for循環(huán)中的哪一段改為自執(zhí)行函數(shù)就ok了。eg:function save_i(){
var a = [], i = 0;for(;i<10;i++){ a[i] = function(i){return i; }(i);}return a;
}
相關(guān)文章:
1. python文檔怎么查看?2. python - pycharm 自動刪除行尾空格3. 安全性測試 - nodejs中如何防m(xù)ySQL注入4. python - pandas按照列A和列B分組,將列C求平均數(shù),怎樣才能生成一個列A,B,C的dataframe5. python - Pycharm的Debug用不了6. html - eclipse 標(biāo)簽錯誤7. python 利用subprocess庫調(diào)用mplayer時發(fā)生錯誤8. 請問PHPstudy中的數(shù)據(jù)庫如何創(chuàng)建索引9. datetime - Python如何獲取當(dāng)前時間10. javascript - 有適合開發(fā)手機(jī)端Html5網(wǎng)頁小游戲的前端框架嗎?
