原生js面試題:作用域和作用域鏈,let聲明的全局變量不是window對象的屬性
JavaScript從入門到精通
專欄收錄該內容
146 篇文章28 訂閱
訂閱專欄
這篇博文是我在心情不好的情況下寫的。
一、作用域
作用域,就是變量起作用的區域(范圍)。或者說,js代碼執行時,查找變量的范圍。
ES5及其以前:
JS的變量作用域分為:全局作用域和函數作用域(局部作用域)
在google的控制台里,可以看到
、用var 聲明的變量a1是全局變量,是window對象的屬性
、用var聲明的變量a2和a3,都是local的作用域
ES6開始有了let關鍵字后:
變量有了塊級作用域,所謂塊級作用域中的“塊”,表示用 一對花括號括起來的一塊代碼。
不管是全局作用域,還是函數作用域,其實都是塊級作用域,無非是大塊還是小塊的問題。
在google的控制台里,我們可以看到,有四個作用域(scope),分別是global(全局)、script(腳本)、local(局部)、block(塊級)。
Global作用域里的內容全是window對象的屬性。
Script里是v1;
Local(function f1)里是v2
Block里是v3
二、作用域鏈
作用域鏈是指:當js編譯器在尋找變量時,先在最近的作用域(花括號)里找,如果找不到,則抄上一級作用域(花括號)里找,依次類推,直到找到或者找不到為止。這就是作用域鏈。
三、Var定義的全局變量是window的屬性,但是let定義定義的全局變量不是window的屬性?
可以看到:
、用var聲明的a0,是window對象的屬性
、用let聲明的v1,屬於script的作用域
、用let聲明的v2,屬於local的作用域
、用let聲明的v3,屬於block作用域
————————————————
版權聲明:本文為CSDN博主「田江」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/jiang7701037/article/details/101314293