在了解這兩個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的形象 但是為什麼...