let
//這是乙個我們常見的問題
var funcs =
;for
(var i =
0; i <
3; i++);
}funcs[0]
();// 3
//用立即函式 解決上述閉包問題
var funcs =
;for
(var i =
0; i <
3; i++)}
(i))
}funcs[0]
();// 0
在迴圈內部,立即執行函式為接受的每乙個變數 i 都建立乙個副本並儲存為變數value
//用es6中let解決上述問題 (慄 1)
var funcs =
;for
(let i =
0; i <
3; i++);
}funcs[0]
();// 0
在這裡let解決閉包的原因是什麼呢?
我們了解的let 不存在變數提公升,不能重複宣告,不能繫結全域性作用域
,可是為什麼在這裡就能正確列印出 i 值呢?
有人猜想說 for 迴圈中,設定迴圈變數的那部分是乙個單獨的作用域:
我們暫且將上面的問題放一放~~
先來看另乙個栗子,看看猜想是否正確:
for
(let i =
0; i <
3; i++
)// es6
// es6
// es6
我們再試一試用var宣告的變數
for
(var i =
0; i <
3; i++
)// es6
為什麼結果就不一樣了呢,如果有單獨的作用域,結果應該是相同的呀……
*注意:let 宣告在迴圈內部的行為是標準中專門定義的
,不一定就與 let 的不提公升特性有關。
在 for 迴圈中使用 let 和 var,底層會使用不同的處理方式。
其實呢上面的**是這樣解釋的:就是在 for (let i = 0; i < 3; i++) 中,即圓括號之內置立乙個隱藏的作用域。
每次迭代迴圈時都建立乙個新變數,並以之前迭代中同名變數的值將其初始化
通俗的來說~~ 每次迴圈的時候let都會建立乙個新的變數 i並將其初始化為i的當前值。
慄1 的**就相當於:
// 偽**
(let i =0)
;}(let i =1)
;}(let i =2)
;};
let i=6;
for(
let i=
0;i<
3;i++
)內部的看成子作用域 ()內部的看成父作用域
}
const
那我們將上面的 let 改為const呢?
var funcs =
;for
(const i =
0; i <
10; i++);
}funcs[0]
();//報錯 因為const中的繫結不可被修改
我們上面說的都是普通的for迴圈,那在for in迴圈中呢?
var funcs =
, object =
;for
(var key in object));
}funcs[0]
()
用var宣告列印結果為』c』
用let宣告,結果為』a』
const呢?它沒有報錯,輸出結果還是』a』這是因為在 for in 迴圈中,每次迭代不會修改已有的繫結,而是會建立乙個新的繫結。
const的特點是在塊級作用域內不能重複宣告,且不能給它重新賦值(重點是塊級作用域)。for in的每一次迴圈都是乙個新塊級作用域,所以可以使用for(const a in b)的形式去遍歷物件的。
ES6的塊級作用域
為什麼要使用塊級作用域?1.在預編譯階段,變數的宣告會被提公升到作用域頂部,而初始化操作依舊留在原處執行,在該作用域中未定義變數的地方也能訪問到該變數,但是此時變數尚未初始化,所以其值為undefined,為此es6引入塊級作用域來強化對變數生命週期的控制 塊級宣告 1.塊級作用域用於宣告在指定塊的...
ES6的塊級作用域
let為j ascript新增了塊級作用域,外層作用域無法獲取到內層作用域,這樣非常安全。即使外層和內層都使用相同變數名,也都互不干擾。例如 1 function test 7 console.log a 輸出 18 910 test 呼叫函式 塊級作用域,允許函式可以在塊級作用域中宣告。在塊級作用...
es6 塊級作用域用法
iife 寫法 function 塊級作用域寫法 塊級作用域的出現,實際上使得獲得廣泛應用的立即執行函式表示式 iife 不再必要了。function f function f 上面 在 es5 jscript不支援塊級作用域環境中執行,會得到 i am inside 因為在 if內宣告的函式f會被...