留心瀏覽器與nodejs於全域之行為並非完全相同

在看mdn: let時有個小地方令人好奇

var x = 'global';
let y = 'global';
console.log('x=', this.x); // output x
console.log('y=', this.y); // output y

同樣這段code,在chrome執行與使用nodejs執行的結果是不同的。

// 瀏覽器之結果(Chrome ver 59.0.3071.115)
x= 'global'
y= undefined
// node.js之結果
x= undefined
y= undefined

原因

瀏覽器部分

  • top-level scope: 在瀏覽器中,top-level scope為global物件,也就是window物件
  • var x: 當使用瀏覽器執行程式時,var會將變數定義在global物件上面。而傳給console.log的this亦是綁定到global物件。故輸出this.x的結果正常顯示。
  • let y: 在top-level使用let,並不會將變數定義在global物件上,故output y之結果為undefined。此為let這個語法的特性,詳見mdn關於let之說明

Nodejs部分

  • 在nodejs中,於top-level scope使用var定義變數,並不會像瀏覽器一般把變數定義在global object,而是定義為當前module的區域變數(local variables)。
  • 傳入console.log()的this參數所代表的意義: 在nodejs中top-level scope並不是global物件,而是module所exports的物件(module.exports)。而傳入console.log()的this代表的就是module.exports的物件。
  • module.exports預設匯出空物件,自然this.x與this.y都是無定義(undefined)。

綜合上述三點,output x才會是undefined而非輸出global。

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.