塊級作用域
作用域
含義
a. 作用域被用來描述在某個代碼塊可見的所有實體(或有效的所有標(biāo)識符),更精準(zhǔn)一點,叫做上下文。是你的代碼在運(yùn)行時,各個變量、函數(shù)和對象的可訪問性。換句話說,作用域決定了你的代碼里的變量和其他資源在各個區(qū)域中的可見性。(上下文和作用域也有區(qū)別
b. 任何一對花括號中的語句集都屬于一個塊,在這之中定義的所有變量在代碼塊外都是不可見的
c. 當(dāng)變量定義在一個函數(shù)中時,變量就在局部作用域中,而定義在函數(shù)之外的變量則從屬于全局作用域。每個函數(shù)在調(diào)用的時候會創(chuàng)建一個新的作用域。
作用
a. 最小訪問原則
b. 為你的代碼提供了一個安全層級。計算機(jī)安全中,有個常規(guī)的原則是:用戶只能訪問他們當(dāng)前需要的東西。
c. 函數(shù)體內(nèi)部,局部變量的優(yōu)先級比同名的全局變量高
塊語句
- 它們不會創(chuàng)建新的作用域。在塊級聲明中定義的變量從屬于該塊所在的作用域。包括但不限于以下(if,switch,for,while等。
1. var
- 通過var聲明的變量沒有塊級作用域
var x = 1;
{
var x = 2;
}
console.log(x); // 輸出 2
2. let
- 其聲明的變量是有塊級作用域的
let x = 1;
{
let x = 2;
}
console.log(x); // 輸出 1
- x = 2被限制在塊級作用域中, 也就是它被聲明時所在的塊級作用域。
- let聲明的變量在塊級作用域內(nèi)能強(qiáng)制執(zhí)行更新變量
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {console.log(i);};
}
a[0](); // 10
a[1](); // 10
a[6](); // 10
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {console.log(i);};
}
a[0](); // 0
a[1](); // 1
a[6](); // 6
3.const
- 其聲明的變量是有塊級作用域的
const c = 1;
{
const c = 2;
}
console.log(c); // 輸出1, 而且不會報錯
- note:注意塊級作用域里的常量聲明const c = 2 并不會拋出SyntaxError: Identifier 'c' has already been declared這樣的語法錯誤,因為這是一個新的作用域。
4.function
foo('outside'); // TypeError: foo is not a function
{
function foo(location) {
console.log('foo is called ' + location);
}
foo('inside'); // 正常工作并且打印 'foo is called inside'
}