ES6中 對塊級作用域的理解,以及三種定義變量的方式對塊級作用域的影響

作用域

作用域是標識符的可訪問範圍
在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
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章