1.使用var:
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
2.使用let
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
問題:在1中,循環(huán)內(nèi)被賦給數(shù)組a的函數(shù)內(nèi)部的console.log(i),里面的i指向的是全局的i,那a[i]的i豈不是也指向全局的i,那豈不是只有a[10]有值?
1、循環(huán)中的語句是立即執(zhí)行
2、每進(jìn)一次循環(huán),都會(huì)給數(shù)組第i項(xiàng)賦值
3、這里賦值的是個(gè)函數(shù),但函數(shù)并沒有執(zhí)行
所以循環(huán)完了是這樣的:
[
function(){console.log(i)},
function(){console.log(i)},
function(){console.log(i)},
function(){console.log(i)},
function(){console.log(i)},
function(){console.log(i)},
function(){console.log(i)}
]
//由于全局的i是10
//所以每一項(xiàng)打印都是10我從《你不了解的JS》總結(jié)了關(guān)于如何理解閉包:
配合一段經(jīng)典的面試代碼就很好理解其一:
function Timer () {
let time = 1
return function () {
console.log(time ++)
}
}
關(guān)于題主的問題,相關(guān)閉包,但主要不在“閉包”上,應(yīng)該是“var與let的作用域的問題”,只有當(dāng)你了解了閉包并且了解了var與let作用域的不同才能想通這兩個(gè)循環(huán)。
總結(jié)下JS的塊級(jí)作用域(偽塊級(jí)作用域):
支持樓上的看法,學(xué)閉包首先得理解這東西到底有什么用,說白了就是保存狀態(tài)。給你看個(gè)閉包實(shí)現(xiàn)復(fù)合數(shù)據(jù)結(jié)構(gòu)的例子把,源自SICP 原版是lisp寫的
// 閉包實(shí)現(xiàn)序?qū)?
let cons = (car,cdr) => (k)=> k === 1 ? car : cdr
let car = (cons) => cons(1)
let cdr = (cons) => cons(2)
// 建立一個(gè)序?qū)︽?var cons2 = cons('序?qū)?', '結(jié)束')
var cons1 = cons('序?qū)?', cons2)
console.log(cdr(cdr(cons1))) // 結(jié)束這個(gè)題還是不要扯到閉包上。應(yīng)該理解var與let的作用域的問題。
看下面的例子,你就知道了。
(function() {
var varTest = 'test var OK.';
let letTest = 'test let OK.';
{
var varTest = 'varTest changed.';
let letTest = 'letTest changed.';
}
console.log(varTest); //varTest changed.
console.log(letTest); //test let OK.
}());
再給你一個(gè)閉包的例子:
function a(){
var n = 0;
function inc() {
n++;
console.log(n);
}
inc();
inc();
}
a(); //控制臺(tái)輸出1,再輸出2for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
這里的a[i] 的意思相當(dāng)于循環(huán)給a數(shù)組添加十個(gè)匿名函數(shù)function () {console.log(i);}; 你可以打印一下a你就知道了 a[i]是已經(jīng)確立的了 至于執(zhí)行a[6]相當(dāng)于執(zhí)行數(shù)組中的第7個(gè)匿名函數(shù) 打印i 這時(shí)候因?yàn)槭褂玫氖莢ar 并不會(huì)產(chǎn)生塊作用域 所以i的取值等于最外層循環(huán)結(jié)束的i值就是10
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。