var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
變量泄露導(dǎo)致上面的a[6]變成10;
我不太理解 這里為什么a[6]是10,我的錯誤思維如下
a[0] = function () { console.log(0);};
a[1] = function () { console.log(1);};
......
a[9] = function () { console.log(9);};
再每一次賦值的時候i的值是正確的,賦值后,每個函數(shù)都是固定輸出一個數(shù)字,也不存在變量
3.請問 我的思維錯在哪里了
其實(shí) es6 的 let 根本沒抓住問題的本質(zhì)
關(guān)鍵在于 js 作為一個允許副作用的語言,它的 closure 卻只支持引用外層作用域的變量,而不支持「引用」外層作用域中變量的值
C++ 就沒有這個問題~
#include <functional>
#include <iostream>
using namespace std;
int main() {
function<void()> a[10];
for (int i = 0; i < 10; i++) {
a[i] = [i] () {
cout << i << '\n';
};
}
a[6](); // 6
}
之所以出現(xiàn)這個反直覺的現(xiàn)象,就是因?yàn)槟隳?10 個函數(shù)引用的都是同一個 i 變量,而這個變量的值是 for 循環(huán)最后一次執(zhí)行時的值,也就是 10。
這個題已經(jīng)問爛了也回答不知道多少遍了
i是全局變量 函數(shù)調(diào)用的時候獲取i 此時 i已經(jīng)循環(huán)到了10
下面是個簡單了例子可以理解為經(jīng)歷了兩次循環(huán)
var i = 1;
function a1(){ console.log(i) }
var i = 2;
function a2(){ console.log(i) }
a1();//2
a2();//2
解決方法 將i變?yōu)榫植孔兞?/p>
es6
{
let i = 1;
function a1(){ console.log(i) }
}
{
let i = 2;
function a2(){ console.log(i) }
}
a1();//1
a2();//2
//es6 let局部變量
for(let i=0;i<10;i++) ...
//or
//自執(zhí)行函數(shù) es5中只有函數(shù)內(nèi)有局部作用域
for (var i = 0; i < 10; i++) {
a[i] = (function(i){
return function () {
console.log(i);
};
})(i)
}問題源于對函數(shù)作用域(鏈)的理解不夠深,一下是個人的一點(diǎn)見解,望能幫助到您:
var a = [];
for (var i = 0; i < 10; i++) { // 此處變量i為全局變量,屬于外層作用域(window)
// 此處聲明函數(shù),創(chuàng)建函數(shù)的作用域(建立作用域鏈,函數(shù)內(nèi)部能訪問外層作用域中的i變量,但此處只是聲明,并不執(zhí)行)
a[i] = function () {
// 函數(shù)內(nèi)部并未定義i變量,當(dāng)函數(shù)執(zhí)行時通過聲明函數(shù)時建立的作用域鏈向上查找變量i
// 調(diào)用a[6]時,for循環(huán)已經(jīng)結(jié)束,變量i已經(jīng)變成10,所以此處打印輸出 10
console.log(i);
};
}
a[6](); // 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)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級產(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)理從事移動互聯(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ù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(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)師。