2016-03-05 58 views
3

我在nodejs上運行此代碼。我想知道爲什麼在執行時不關閉字符串'Globals'?封閉體中的this不是指向全局範圍嗎?Javascript關閉按預期工作

// Running on NodeJS, not in a browser! 
this.name = "Globals"; 

function Person(name) { 
    this.name = name; 
    this.namePrinter = function() { 
    return function() { 
     console.log(this.name); 
    } 
    } 
} 

var p = new Person("Faiz"); 
p.namePrinter()(); // prints undefined. Shouldn't it print Globals? 
console.log(this.name); // prints Globals 

回答

5

你的榜樣按預期正常運行在瀏覽器中,但在頂層的node.js this是不一樣的global,這是你的模塊.exports。所以,當你做

this.name = "Globals"; 

它指定name: Globalsmodule.exports,不給global對象。

現在,當你寫

p.namePrinter()(); 

是一樣的:

func = p.namePrinter(); 
func(); 

功能是綁定(=有之前沒有object.),因此它的this將是global對象。但是在那裏沒有name ...

在瀏覽器中,您的頂級代碼在全局對象(即window)的上下文中執行,並且這是與未綁定函數使用的相同對象。這就是你的代碼片段工作的原因。

+0

^^當然!衛生署。 –

+0

很好地解釋了+1 –

+0

'setTimeout'是如何進入答案的?我修好了,但我很好奇。這實際上是一個愚蠢的? –