ES6 迴圈中的塊級作用域

2021-09-22 10:02:16 字數 2142 閱讀 7606

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會被...