作用域和作用域鏈,let聲明的全局變量不是window對象的屬性

 

這篇博文是我在心情不好的情況下寫的。

 

一、作用域

作用域,就是變量起作用的區域(範圍)。或者說,js代碼執行時,查找變量的範圍。

  1. ES5及其以前:

        JS的變量作用域分爲:全局作用域和函數作用域(局部作用域)

 

在google的控制檯裏,可以看到

  1. 、用var 聲明的變量a1是全局變量,是window對象的屬性
  2. 、用var聲明的變量a2和a3,都是local的作用域

 

  1. ES6開始有了let關鍵字後:

變量有了塊級作用域,所謂塊級作用域中的“塊”,表示用 一對花括號括起來的一塊代碼。

不管是全局作用域,還是函數作用域,其實都是塊級作用域,無非是大塊還是小塊的問題。

 

 

 

在google的控制檯裏,我們可以看到,有四個作用域(scope),分別是global(全局)、script(腳本)、local(局部)、block(塊級)。

  1. Global作用域裏的內容全是window對象的屬性。
  2. Script裏是v1;
  3. Local(function f1)裏是v2
  4. Block裏是v3

 

二、作用域鏈

作用域鏈是指:當js編譯器在尋找變量時,先在最近的作用域(花括號)裏找,如果找不到,則抄上一級作用域(花括號)裏找,依次類推,直到找到或者找不到爲止。這就是作用域鏈。

 

三、Var定義的全局變量是window的屬性,但是let定義定義的全局變量不是window的屬性?

 

 

可以看到:

  1. 、用var聲明的a0,是window對象的屬性
  2. 、用let聲明的v1,屬於script的作用域
  3. 、用let聲明的v2,屬於local的作用域
  4. 、用let聲明的v3,屬於block作用域

 

 

這篇博文是我在心情不好的情況下寫的

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