作用域
作用域是標識符的可訪問範圍
在Javascript常用三種作用域(詞法環境):
- 1),全局作用域------全局定義
- 2), 函數作用域-------在函數內部定義
- 3), 塊級作用域-----ES6新增的,用{}來界定塊級作用域。
1,塊作用域由 { } 包括,if語句和for語句裏面的{ }也屬於塊作用域。
2,ES6新增了塊級作用域,使用let聲明的變量有塊的概念,var聲明的變量則沒有塊級作域的概念;
if(true){ var num = 100; }
console.log(num); //正常打印100
if(true){ let age = 60; }
console.log(age); //報錯:age is not defined
注意
var定義的變量,沒有塊的概念,可以跨塊訪問, 不能跨函數訪問。
let定義的變量, 有塊的概念,不能跨塊訪問,也不能跨函數訪問。
const用來定義常量,有塊的概念,不能跨塊訪問,而且不能修改。
三種定義變量的常見問題(變量提升和暫存死區)
1,變量提升
console.log(number); // undefined
var number = 1000;
console.log(number); // 1000
var聲明的變量能夠提前使用雖然只是undefined, 我們把這種現象稱之爲變量提升
2,暫存死區
function do_something() {
console.log(bar); // undefined
console.log(foo); // ReferenceError: Cannot access 'foo' before initialization
var bar = 1;
let foo = 2;
}
do_something() ;
與通過 var 聲明的有初始化值 undefined 的變量不同,
通過 let 聲明的變量直到它們的定義被執行時才初始化。在變量初始化前訪問該變量會導致 ReferenceError。該變量處在一個自塊頂部到初始化處理的“暫存死區”中。
參考 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/let
作者:糯米糰子_大芒果
鏈接:https://www.jianshu.com/p/6b6b322b6e4d
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。