在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

Image

新手,對(duì)閉包的理解不夠,希望大佬們?cè)敿?xì)說(shuō)下這段代碼的運(yùn)行過(guò)程,原理,機(jī)制等

回答
編輯回答
陌如玉

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

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

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

阮一峰ES6中有將到這點(diǎn)

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

如果使用let,聲明的變量?jī)H在塊級(jí)作用域內(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其實(shí)都是一個(gè)新的變量,所以最后輸出的是6。你可能會(huì)問(wèn),如果每一輪循環(huán)的變量i都是重新聲明的,那它怎么知道上一輪循環(huán)的值,從而計(jì)算出本輪循環(huán)的值?這是因?yàn)?JavaScript 引擎內(nèi)部會(huì)記住上一輪循環(huán)的值,初始化本輪的變量i時(shí),就在上一輪循環(huán)的基礎(chǔ)上進(jìn)行計(jì)算。

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

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

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

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

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

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

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

js中沒(méi)有代碼塊的限制, 所以變量i就是一個(gè)全局變量

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

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

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

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

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

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

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

這個(gè)是考的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() {
    // 此時(shí)無(wú)論這個(gè)方法內(nèi)怎么寫都無(wú)所謂,不執(zhí)行的
    console.log(index)
  }
}
a[6]() // 這時(shí)執(zhí)行方法,而index已經(jīng)for完成了
2017年12月16日 18:59
編輯回答
舊酒館

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

你不斷調(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
可以看看這個(gè)系列
2017年11月1日 06:26