js塊級作用域

2021-09-11 14:53:26 字數 2369 閱讀 5436

在了解這兩個api前,我們先了解一下塊級作用域這個概念。

定義:是乙個語句,將多個操作封裝在一起,通常是放在乙個大括號裡,沒有返回值。

為何需要塊級作用域?

在es6之前,函式只能在全域性作用域和函式作用域中宣告,不能在塊級作用域中宣告。沒有塊級作用域導致很多場景不合理:

1、記憶體變數可能覆蓋外層變數

var a = 33;

function test()

}test(); // undefined

輸出的結果為undefined,是因為變數提公升導致內層的 a 變數覆蓋了外層的 a 變數。

2、用來計數的迴圈變數洩露為全域性變數

for (var i = 0; i < 10; i++)

console.log(i); // 10

上面的變數i 只是用來控制迴圈,但是迴圈之後,並沒有消失,而是洩露為全域性變數了。

es6中的塊級作用域:

1、允許塊級作用域任意巢狀,外層作用域無法讀取內層作用域的變數

console.log(i); // 報錯

}}}}

2、內層作用域可以定義外層作用域的同名變數

}}}}

3、不需要立即執行匿名函式

立即執行函式:

(function() ());

塊級作用域:

塊級作用域中的函式宣告

執行環境:es6瀏覽器。

可實現的行為:

1、允許在塊級作用域內宣告函式

2、函式宣告類似於var, 即會提公升到全域性作用域或函式作用域的頭部

3、函式宣告還會提公升到所有塊級作用域的頭部

function func()

(function()

}func();

})();

考慮到環境導致的差異太大,應該避免在塊級作用域中宣告函式,如果需要,應該寫成函式表示式的形式,而不是函式宣告語句:

let func= function func() ;

es6的塊級作用域允許宣告函式的規則只在使用大括號的情況下成立:

『use strict』:

if (true) // 不報錯

}if (true)

function func2() {} // 報錯

在了解完塊級作用域後,我們來看看 let 命令:

什麼是 let ?

let 是es 用於宣告變數的命令,與 var 類似,與之不同的是:

1、let 宣告的變數只在塊級作用域內有效

2、不存在變數提公升,而是「繫結」在暫時性死區

3、不能重複宣告

let 宣告的變數只在塊級作用域內有效

『use strict』;

function func(args)

console.log('outside: 』 + i); // 報錯 「i is not defined」

};func();

不存在變數提公升,而是「繫結」在暫時性死區

// 不存在變數提公升

『use strict』;

function func();

func(); // 報錯

在let宣告變數前,使用該變數,它是會報錯的,而不是像var那樣會『變數提公升』。

其實說let沒有『變數提公升』的特性,不太對。或者說它提公升了,但是es6規定了在let宣告變數前不能使用該變數。

『use strict』;

var test = 1;

function func();

func(); // 報錯

如果let宣告的變數沒有變數提公升,應該列印』1』(func函式外的test);而它卻報錯,說明它是提公升了的,只是規定了不能在其宣告之前使用而已。我們稱這特性叫「暫時性死區(temporal dead zone)」。且這一特性,僅對遵循『塊級作用域』的命令有效(let、const)。

let使用經典案例:let命令代替閉包功能

閉包實現:

var arr = ;

for(var i = 0; i < 2; i++);

}(i));

};arr1;

let 實現:

『use strict』;

var arr = ;

for(let i = 0; i < 2; i++);

};arr1;

剩下 const 命令了!

const 與 let 的使用規範一樣,與之不同的是:

const 宣告的是乙個常量,且這個常量必須賦值,否則會報錯。

『use strict』;

function func();

func(); // 報錯「missing initializer in const declaration」

let 和 const 就介紹到這,下期介紹變數的解構。

js塊級作用域

首先看乙個常見的函式,該函式輸出的是什麼呢?對的,就是5個6.為什麼會這樣呢?因為settimeout是個非同步函式,每次迴圈的時候都會建立乙個定時器,任務放到佇列裡,等主線程執行完才會執行定時器,這個時候迴圈跑完了,最後一次的 i 5 1 6,所以輸出5個6.for var i 1 i 5 i 1...

JS 無塊級作用域

js作用域為 函式級作用域 記住最簡明的一句 函式中宣告的所有變數,無論是在 宣告的,在整個函式中它們都是有定義的。下面是自己的筆記 1 首先,只是在這個函式中有定義,也就是說,在輸出語句後定義和輸出語句前定義是一樣的結果,最後變數的值都是 undefined 下面兩種寫法結果一樣 function...

塊級作用域

跨級作用域本身沒有宣告可以說的,就需要注意兩點 1.跨級作用域內宣告的var變數並不會存在這個塊級作用域內,而是會提公升到非塊級作用域內 2.在塊級作用域內宣告function,在不同瀏覽器會有不同結果,如果是根據條件宣告function的話,請用var func function的形象 但是為什麼...