2012-01-19 47 views
1

時調用如果在JavaScript中如何做getName()回報john爲什麼沒有這指的窗口的setTimeout

function Person() { 
    this.name = "john"; 
    this.getName = function() { 
     return this.name; 
    }; 
} 

var me = new Person(); 
setTimeout(function(){alert(me.getName())}, 3000); 

我雖然this將參照窗口中的點的功能實例沒有約束力致電setTimeout

見的jsfiddle:http://jsfiddle.net/qZeXG/

回答

1

這裏發生的事情是,通過setTimeout執行的匿名函數關閉在me變量,這是一個Person實例。由於關閉,當稍後調用該函數時仍然可以引用me

當你調用me.getName()你調用的是Person實例的方法,它的this值設置爲me該函數內部。這只是一個普通的方法調用。

注意,在下面的代碼:

var me = new Person(); 
setTimeout(function() { 
    alert(this); 
    alert(me.getName()); 
}, 3000); 

...的this第一alertwindow對象。這是正在改變值的普通方法調用。

考慮這最後一個例子:

var me = new Person(); 
var getName = me.getName; 
setTimeout(function(){ alert(getName()) }, 3000); 

在這種情況下,功能也將關閉到getName參考,但該變量指向是沒有關於它來自Person實例的任何信息調用函數。因此,this內部的值getNamewindow對象。

結論?本聲明:

...有在JavaScript中沒有的功能,結合實例...

...是一個錯誤的假設。

+0

這是否是一個錯誤的假設,它似乎需要匿名函數來關閉它的事實意味着重要的是函數與上下文的綁定,即閉包,就像您執行'setTimeout(me。getName(),3000);'有錯誤。 – zode64

0

this將Person實例,因爲你的me對象上調用getName

如果您只是直接調用getName而不是作爲me的屬性,則this會引用該窗口。

例如:

var getName = me.getName; 
alert (getName()) 

alert (me.getName.call (this)) 
相關問題