2012-02-14 26 views
3

有人可以在下面的innerF中詳細說明,this是指什麼? UserinnerF不能理解這是指什麼

function User(){ 
    this.id = 1; 
}; 

User.prototype.sayHi = function(){ 
    var innerF = function(){ 
     this.id = 2; // "this" refers to User or innerF ? 
    }; 

    return innerF; 
}; 

也做了new關鍵字或匿名功能有變化this關鍵字的參考呢?

如果我叫它全是這樣的:

var u = User; 
var f = u.sayHi(); 
f(); 

或者

var u = new User; 
var f = u.sayHi(); 
f(); 

感謝

+0

你爲什麼不嘗試一下呢? :) – 2012-02-14 15:49:37

+1

@Topener:我不知道該如何嘗試,學習JS :) – Dev555 2012-02-14 15:50:55

+0

@Topener:好像我設法調用它。 – Dev555 2012-02-14 15:55:51

回答

6

this本地所指的innerF內部將取決於函數最終如何調用。它可以以各種方式調用,這將改變this的含義。例如

var u = new User(); 
var innerF = u.sayHi(); 
innerF();    // 'this' is window 
innerF.call(u);  // 'this' is 'u' 
innerF.call("hello"); // 'this' is "hello" 

基於您的代碼,雖然它顯示了要this指上sayHi被調用的User實例。如果是這樣,那麼你需要將this存儲在本地,並參考innerF內的本地。

User.prototype.sayHi = function(){ 
    var self = this; 
    var innerF = function(){ 
     self.id = 2; 
    }; 

    return innerF; 
}; 

不過,請注意thissayHi不保證指向User實例要麼。一般來說,可以完成的sayHiinnerF完成相同的技巧。例如

var sayHi = u.sayHi; 
sayHi(); // 'this' is window 
+0

謝謝,但我想讓'this'指代'innerF',我有還提供了運行它的代碼。 – Dev555 2012-02-14 15:58:41

+0

謝謝你現在很清楚:) – Dev555 2012-02-14 16:02:15

+0

@ Dev555:你想'this'指的是函數本身?爲什麼不使用'innerF.id = ...'而不是'this'? – 2012-02-14 16:08:48

2

你不能調用的代碼的功能,所以它並不指到任何東西呢。

this值,當你調用功能,不定義它(除非你使用像bind)確定。

+0

您能否詳細說明如何調用影響'this'的引用?用代碼。謝謝 – Dev555 2012-02-14 15:54:03

+0

@ Dev555:做一些研究,閱讀一些文檔:https://developer.mozilla.org/en/JavaScript/Reference/Operators/這個 – 2012-02-14 15:57:12

1
var u = User; 
var f = u.sayHi(); 
f(); 

上面的代碼將拋出錯誤。 User是一個函數,而不是User對象,所以它沒有方法sayHi,所以你會得到下面的錯誤。

Uncaught TypeError: Object function User(){ 
    this.id = 1; 
} has no method 'sayHi' 

var u = new User; 
var f = u.sayHi(); 
f(); 

上面的代碼不會拋出錯誤,並且uUser對象,(how new worksfrom mdn),和它的方法sayHi返回功能,您可以通過f();執行的功能,所以函數內部的this在調用函數時引用當前上下文。因此,如果您的代碼位於全局範圍內,則this指的是window對象。

而且你可以通過f.call(u);設定的範圍內,那麼this所指的對象u,並更改了用戶對象u的ID爲2

相關問題