鍍金池/ 問答/網(wǎng)絡(luò)安全  HTML/ js閉包問題,為什么是這個結(jié)果

js閉包問題,為什么是這個結(jié)果

Image

新手,對閉包的理解不夠,希望大佬們詳細說下這段代碼的運行過程,原理,機制等

回答
編輯回答
陌如玉

1、function 并沒形成閉包!你都能直接調(diào)用該函數(shù),沒閉包說法!
2、es6之前,只存在兩個作用域: 全局和function

所以i和function的執(zhí)行環(huán)境同,且無閉包。待調(diào)用函數(shù)時,i = 10

2017年5月25日 23:20
編輯回答
囍槑

阮一峰ES6中有將到這點

他書中的解釋
變量i是var命令聲明的,在全局范圍內(nèi)都有效,所以全局只有一個變量i。每一次循環(huán),變量i的值都會發(fā)生改變,而循環(huán)內(nèi)被賦給數(shù)組a的函數(shù)內(nèi)部的console.log(i),里面的i指向的就是全局的i。也就是說,所有數(shù)組a的成員里面的i,指向的都是同一個i,導(dǎo)致運行時輸出的是最后一輪的i的值,也就是 10。

如果使用let,聲明的變量僅在塊級作用域內(nèi)有效,最后輸出的是 6。

var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6

上面代碼中,變量i是let聲明的,當(dāng)前的i只在本輪循環(huán)有效,所以每一次循環(huán)的i其實都是一個新的變量,所以最后輸出的是6。你可能會問,如果每一輪循環(huán)的變量i都是重新聲明的,那它怎么知道上一輪循環(huán)的值,從而計算出本輪循環(huán)的值?這是因為 JavaScript 引擎內(nèi)部會記住上一輪循環(huán)的值,初始化本輪的變量i時,就在上一輪循環(huán)的基礎(chǔ)上進行計算。

2018年5月13日 09:43
編輯回答
久舊酒

http://www.cnblogs.com/wangfu... 去看看王福朋關(guān)于閉包的一系列解讀吧。適合新手,簡單易懂。

2018年8月31日 03:39
編輯回答
護她命

i是全局變量 調(diào)用a[6]()的時候去取i的值 這時候i早循環(huán)到10
跟下面一個道理

var i = 0;
var a = function(){
    console.log(i)
}
i=10;
a()//10

調(diào)用的時候才去取值

2017年8月2日 09:42
編輯回答
巴扎嘿

js中沒有代碼塊的限制, 所以變量i就是一個全局變量

2018年1月22日 07:58
編輯回答
別瞎鬧

函數(shù)內(nèi)相關(guān)的值是在執(zhí)行時確定的。
所以執(zhí)行時去確定i,沒有傳入i的值,會去外層作用域找,此時i已經(jīng)在遍歷完變成了10。
跟閉包沒多大關(guān)系。

2017年12月19日 04:44
編輯回答
悶油瓶

去了解一下es6里面的let和var的區(qū)別就知道了

2018年7月15日 23:08
編輯回答
放開她

無論i是幾,a[i]();都是10,因為函數(shù)作用域變量的值是運行時確定的,不是定義時確定的,當(dāng)函數(shù)執(zhí)行的時候i已經(jīng)++到10了。

2017年11月1日 17:50
編輯回答
赱丅呿

這個是考的var的作用域,你可以這樣試一下,應(yīng)該就能明白了

var a = []
console.log(index) // undifined
console.log(b) // b is not defined
for (var index = 0; index < 10; index++) {
  a[index] = function() {
    // 此時無論這個方法內(nèi)怎么寫都無所謂,不執(zhí)行的
    console.log(index)
  }
}
a[6]() // 這時執(zhí)行方法,而index已經(jīng)for完成了
2017年12月16日 18:59
編輯回答
舊酒館

這是函數(shù)運行中 執(zhí)行上下文環(huán)境壓棧入棧的過程。

你不斷調(diào)用a[i], 都是從function(){ console.log(1) } 壓棧,然后 function(){ console.log(2) } 壓棧,然后function(){ console.log(3) }。一直到function(){ console.log(10) }壓棧

http://www.cnblogs.com/wangfupeng1988/p/3992795.html
可以看看這個系列
2017年11月1日 06:26