2014-08-31 41 views
1

我有模塊...爲什麼引用'this'會返回值,應該是undefined?

var myModule = (function(){ 

    var obj = new Object(); 
    obj.name = ""; 
    obj.sayName = function(){ 
     obj.name = "jon"; 
     console.log(obj.name); 
     console.log(this.name); 
    } 
    return obj; 

})() 

myModule.sayName(); 

將打印出單詞'喬恩的兩倍,佔的console.log語句。

但是我不明白爲什麼'this'是正確的,因爲它會返回對函數的引用,並且'undefined'不是嗎?

+2

'this'' obj'因爲'obj'是'myModule'並且你調用像'myModule.sayName()'這樣的函數,注意這個點。 – elclanrs 2014-08-31 10:14:25

+0

但我認爲是因爲它是一個新的函數,它會得到自己的閉包? – Exitos 2014-08-31 10:22:02

+0

這與閉包或範圍無關,而是與''this'如何在JavaScript中起作用。基本上,如果被稱爲'a.b.c()',''中的'this'指的是最後一個點之前的最後一個名字 - 'b'。所以在你的情況下,最後一個點之前的名字是'myModule'。看到這個答案的更多信息:http://stackoverflow.com/questions/13441307/how-does-the-this-keyword-in-javascript-act-within-an-object-literal/13441628#13441628 – slebetman 2014-09-05 08:20:56

回答

3

您正在致電myModule.sayName()所以this裏面sayNamemyModule

myModule的值是來自obj的對象引用的副本(因爲這是從匿名IIFE返回的內容)。因此obj.namethis.name是相同的值。

+0

但我想函數sayname具有它自己的閉包,它是自己的?我將不得不將這個分配給更高級別的「自我」? – Exitos 2014-08-31 10:19:00

+3

@Exitos:'sayName'確實是一個閉包(通過'obj'和其他一些東西),但這與它內部的「this」無關。正如Quentin所說,「這個」主要由函數的調用來決定。當你通過一個從一個對象屬性('myModule.sayName();')獲得函數引用的表達式調用一個函數時,在調用函數的過程中,'this'將是你得到屬性的對象(通常是;那裏* bound *函數的工作方式不同,ES6的箭頭函數的工作方式不同,但是'sayName'是正常的)。 – 2014-08-31 10:22:03

+0

謝謝你...... – Exitos 2014-08-31 10:51:36

相關問題