1. 程式人生 > 其它 >面試官:在全域性作用域下宣告的變數一定會成為Global物件的屬性嗎?

面試官:在全域性作用域下宣告的變數一定會成為Global物件的屬性嗎?

全域性變數在瀏覽器和Node環境下的區別

我們知道,在JavaScript中宣告的全域性變數,會變成Global物件的屬性。這個Global物件在瀏覽器中為window物件,在Node環境下為global物件。

看下面這段簡單的程式碼:

var name = 'jack'
console.log(this.name) //輸出什麼?

根據上面的分析,顯然會打印出jack。

我們用Chrome試一下。在這裡插入圖片描述
確實沒錯。

按理說,在Node環境下,應該也是相同的結果。

我們試下:
在這裡插入圖片描述
結果似乎出人意料:同樣的程式碼,在瀏覽器和Node環境下,竟然出現了不同的結果。

從上面的測試程式碼我們可以看出:用 var 宣告的變數,在瀏覽器環境下會成為window物件的屬性,而在Node環境下不會成為global物件的屬性。

那如果用 let 呢?是和 var 表現一樣,還是有所區別?

用 let 宣告的全域性變數不會成為window物件的屬性

《JavaScript高階程式設計》裡寫得很清楚:

與var關鍵字不同,使用 let 在全域性作用域中宣告的變數不會成為window物件的屬性。

例如:

var name = 'Matt'在這裡插入程式碼片
console.log(window.name) // 'Matt'

let age = '26'
console.log(window.name) //undefined

我們也可以直接將window打印出來:
在這裡插入圖片描述
可以看到,window物件裡的確只有用 var 宣告的變數。

總結

  1. 使用 var 宣告的全域性變數,在瀏覽器環境下會成為window物件的屬性,在Node環境下不會成為global物件的屬性。
  2. 使用 let 宣告的全域性變數,即便在瀏覽器環境下不會成為window物件的屬性。