亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

javascript let和var的用法

javascript let和var的用法

素胚勾勒不出你 2018-08-10 09:06:58
在看阮老師的ECMAScript 6 入門 時遇到了這個問題。先貼代碼 :var a = [];for (var i = 0; i < 10; i++) {   a[i] = function () {    console.log(i);   }; } a[6](); // 10不理解為什么是10,書中是這樣解釋的。變量i是var聲明的,在全局范圍內都有效。所以每一次循環,新的i值都會覆蓋舊值,導致最后輸出的是最后一輪的i的值。先假設是覆蓋了,那為什么是10,為什么不是9, 不是 i < 10 嗎?還有這個let的用法var a = [];for (let i = 0; i < 10; i++) {   a[i] = function () {    console.log(i);   }; } a[6](); // 6let聲明 i , 就得到了6,這是為什么啊?書中是這樣解釋的。變量i是let聲明的,當前的i只在本輪循環有效,所以每一次循環的i其實都是一個新的變量,所以最后輸出的是6。整理下問題 :1.用var聲明的為什么結果是10,就算不是6,也該是9啊,因為循環是從0-9.2.用let聲明的為什么是6?
查看完整描述

1 回答

?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

1 這個問題跟var let沒關系,10是因為循環到9以后,js并不知道循環結束了,還會進行下一次循環,i加一等于10,然后判斷條件發現不滿足,才跳出循環。
2 var i你想象成全局變量,每次循環修改的、函數里面console.log訪問的,都是同一個i。a[6]()是在循環結束后執行的,這時候的i由第一問知道是10。
let i你想象成局部變量,每次循環都生成一個新的,函數里面console.log訪問的也都是不同的i。下面這段代碼可能對你有點繞,但理解后對你學習js的變量很有幫助:

for (var i=0;i<10;i++) {
  a[i]=(function(i){    return function() {      console.log(i);
    })(i);
}
a[6](); // 6

循環變量i傳到一個立即執行函數里,變成了局部變量i(其實這個函數的參數可以任意取名,取成i為了加深你的理解),在這個局部變量的作用域內定義了一個函數引用了它,js就會把它作為函數的上下文保存起來,所以console.log得到的是0到9不同的值。


查看完整回答
反對 回復 2018-09-23
  • 1 回答
  • 0 關注
  • 1079 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號