var Greeters = []
for (var i = 0 ; i < 10 ; i++) {
Greeters.push(function () { return console.log(i) })
}
Greeters[0]() // 10
Greeters[1]() // 10
Greeters[2]() // 10
var Greeters = []
for (var i = 0 ; i < 10 ; i++) {
Greeters.push(i)
}
Greeters[0] // 0
Greeters[1] // 1
Greeters[2] // 2
看了for循環(huán)問題和函數(shù)形參問題 這個提問 自己試了下,還不是很懂,
為什么第一段代碼 是 10 10 10 第二段代碼又變成了 0 1 2
求大佬 通俗點的解釋,打個比方 舉個栗子.
function () {console.log(i)}
的函數(shù),那么執(zhí)行的時候就會去找i,可是你又沒有把i的值傳進函數(shù),函數(shù)內里找不到i的值,所以會去外面房子里找,這個時候i已經是10了。function () {console.log(i)}
塞到了一個小盒子里,執(zhí)行的時候去找i,函數(shù)里沒i的值,會在屋子里找到各自的i,所以分別是0-9。總結下就是:
改了答案,剛發(fā)現(xiàn)寫著寫著把小盒子的設定弄錯了。
1.
var Greeters = []
for (var i = 0 ; i < 10 ; i++) {
Greeters.push(function () { return console.log(i) })
}
Greeters[0]() // 10
Greeters[1]() // 10
Greeters[2]() // 10
其中var i = 0定義了變量i值為0,假設其地址是addr0。在for的過程中i的值不斷從0~9變化,每變化一次他的存儲地址跟著變化一次,完成了整個for的過程i指向addr9,最后var i = 10,判斷超出i<10,不執(zhí)行for,此時i最終指向addr10,這個時候不管怎么引用函數(shù),i的存儲地址都是addr10其值為10。
2
var Greeters = []
for (var i = 0 ; i < 10 ; i++) {
Greeters.push(i)
}
Greeters[0] // 0
Greeters[1] // 1
Greeters[2] // 2
這里推向Greeters的不是變量,而是確切的數(shù)字,所以其指向地址不改變其值不改變。
又是可愛的我。
舉例子不會,但是我可以告訴你要想清楚哪些問題。
其次,這個問題的主要是三點,一個是let和var的區(qū)別,第二是for循環(huán)的問題,第三是涉及到了函數(shù)形參與實參的問題。
先說第一個問題,let和var都是用來聲明局部變量,既然叫局部變量,想必你也知道,在當前代碼塊結束之后,這個變量就不能用了。但是不能用是不能用了,let聲明的變量系統(tǒng)就直接把變量地址和值都回收了(就像刪了,放進回收站了),但是var聲明的變量系統(tǒng)還保留了它的地址和值。
第二個問題,注意到for循環(huán)中function的問題,要想清楚function()這個操作是沒有做值的傳遞,換句話說,里面的變量是調用外層的變量值(相當于對于該函數(shù)的全局變量)。
第三個問題重中之重,函數(shù)調用時,引入函數(shù)主體中的形參實際上是你放入()中的實參的一個復制。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網學院和江蘇省首批服務外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術與教育服務機構,發(fā)展為教育服務業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯(lián)網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。