var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
變量泄露導致上面的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.請問 我的思維錯在哪里了
其實 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)象,就是因為你那 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ù)作用域(鏈)的理解不夠深,一下是個人的一點見解,望能幫助到您:
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變量,當函數(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年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學院和江蘇省首批服務外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務機構(gòu),發(fā)展為教育服務業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。