2014-08-31 65 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

相关问题