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ù)形參問題 這個(gè)提問 自己試了下,還不是很懂,
為什么第一段代碼 是 10 10 10 第二段代碼又變成了 0 1 2
求大佬 通俗點(diǎn)的解釋,打個(gè)比方 舉個(gè)栗子.
function () {console.log(i)}的函數(shù),那么執(zhí)行的時(shí)候就會(huì)去找i,可是你又沒有把i的值傳進(jìn)函數(shù),函數(shù)內(nèi)里找不到i的值,所以會(huì)去外面房子里找,這個(gè)時(shí)候i已經(jīng)是10了。function () {console.log(i)}塞到了一個(gè)小盒子里,執(zhí)行的時(shí)候去找i,函數(shù)里沒i的值,會(huì)在屋子里找到各自的i,所以分別是0-9。總結(jié)下就是:
改了答案,剛發(fā)現(xiàn)寫著寫著把小盒子的設(shè)定弄錯(cuò)了。
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,假設(shè)其地址是addr0。在for的過程中i的值不斷從0~9變化,每變化一次他的存儲(chǔ)地址跟著變化一次,完成了整個(gè)for的過程i指向addr9,最后var i = 10,判斷超出i<10,不執(zhí)行for,此時(shí)i最終指向addr10,這個(gè)時(shí)候不管怎么引用函數(shù),i的存儲(chǔ)地址都是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ù)字,所以其指向地址不改變其值不改變。
你有10個(gè)蘋果往箱子里裝,裝之前你需要寫上現(xiàn)在是第幾個(gè),寫字其實(shí)就相當(dāng)與一個(gè)方法,然后放箱子里.
區(qū)別就是第一個(gè)你放進(jìn)箱子里的是一個(gè)寫字的方法(function () { return console.log(i) }) 你并沒有寫,因?yàn)樗麤]執(zhí)行.
等你十個(gè)都放進(jìn)去了之后,你拿出來一個(gè)要寫字了(就是要執(zhí)行這個(gè)方法了),但是現(xiàn)在已經(jīng)十個(gè)都放進(jìn)去了,已經(jīng)操作到第十個(gè)了,現(xiàn)在就是第10個(gè),你拿哪個(gè)出來寫個(gè)字不都是10么.
第二種就是你先寫了字,在放進(jìn)去.
又是可愛的我。
舉例子不會(huì),但是我可以告訴你要想清楚哪些問題。
其次,這個(gè)問題的主要是三點(diǎn),一個(gè)是let和var的區(qū)別,第二是for循環(huán)的問題,第三是涉及到了函數(shù)形參與實(shí)參的問題。
先說第一個(gè)問題,let和var都是用來聲明局部變量,既然叫局部變量,想必你也知道,在當(dāng)前代碼塊結(jié)束之后,這個(gè)變量就不能用了。但是不能用是不能用了,let聲明的變量系統(tǒng)就直接把變量地址和值都回收了(就像刪了,放進(jìn)回收站了),但是var聲明的變量系統(tǒng)還保留了它的地址和值。
第二個(gè)問題,注意到for循環(huán)中function的問題,要想清楚function()這個(gè)操作是沒有做值的傳遞,換句話說,里面的變量是調(diào)用外層的變量值(相當(dāng)于對(duì)于該函數(shù)的全局變量)。
第三個(gè)問題重中之重,函數(shù)調(diào)用時(shí),引入函數(shù)主體中的形參實(shí)際上是你放入()中的實(shí)參的一個(gè)復(fù)制。
看錯(cuò)了重新答
我看了鏈接 鏈接的問題是變量作用域問題
js中只有函數(shù)內(nèi)有局部作用域
鏈接的第二個(gè)循環(huán)是let這是es6新的聲明局部變量
第一種調(diào)用Greeters[0]的時(shí)候是10是因?yàn)檎{(diào)用的時(shí)候才從全局取值 這時(shí)候i已經(jīng)循環(huán)完畢保持為10
第二種調(diào)用Greeters[0]的時(shí)候是0是因?yàn)檎{(diào)用的時(shí)候是先從局部作用域取值所有i為0
你的第二個(gè)是直接把值0放進(jìn)數(shù)組里調(diào)用的時(shí)候直接取值0
第一個(gè) 并不是push了 1 23 這些數(shù)字 而是push了一個(gè)函數(shù)對(duì)象
他push了是9個(gè)相同的 函數(shù) 你每次是需要調(diào)用 函數(shù) 通過數(shù)組索引訪問到函數(shù) 然后調(diào)用函數(shù)
也就是小括號(hào)作用 所以每次都是輸出10
每次調(diào)用for 循環(huán)是瞬間執(zhí)行完的 所以他只會(huì)輸出 10
第二次是把1 2 3 4這些數(shù)字push 到數(shù)組里面 所以 你按索引訪問就是對(duì)應(yīng)的每個(gè)數(shù)字
北大青鳥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
北大課工場(chǎng)是北京大學(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)師。