2

我正在读这个 - http://learn.jquery.com/javascript-101/this-keyword/但有一个我不太明白的例子。

// A function being attached to an object at runtime.
var myName = "the global object";
var sayHello = function() {
    console.log( "Hi! My name is " + this.myName );
};
var myObject = {
    myName: "Rebecca"
};
var secondObject = {
    myName: "Colin"
};

myObject.sayHello = sayHello;
secondObject.sayHello = sayHello;

sayHello();              // "Hi! My name is the global object"
myObject.sayHello();     // "Hi! My name is Rebecca"
secondObject.sayHello(); // "Hi! My name is Colin"

我都明白了,除了这两行:

myObject.sayHello = sayHello;
secondObject.sayHello = sayHello;

我们到底用它们做什么?我们为对象创建新键,并声明它们的值将是函数 sayHello,但我们省略括号是为了不显式调用函数?为什么我们需要它们?如果我们省略它们,我们会不会得到相同的结果,并且不会再次成为“在运行时附加到对象的函数”?

4

3 回答 3

3

我们为对象创建新的键,并声明它们的值将是函数 sayHello,

是的

但是我们省略括号是为了不显式调用函数?

是的。如果您调用了该函数,那么您将分配函数调用的返回值而不是函数本身。

如果我们省略它们,我们会不会得到相同的结果

如果你省略这两行,那么myObject.sayHello将会是undefined,当你尝试调用时你会得到一个错误undefined()

于 2013-03-29T07:33:36.873 回答
1
var sayHello = function() {
    ...
};
myObject.sayHello = sayHello;

是相同的:

var myObject = {
    myName: "Rebecca",
    sayHello: function() {
        ...
    }
};
于 2013-03-29T07:42:05.227 回答
1

发生的事情是您指向myObject.sayHellosayHello函数(并且省略括号,否则您将分配被调用函数的结果)。每当您调用该sayHello函数时,this将是您调用的对象sayHello

所以对于myObject.sayHellothis会的myObject

对于简单的调用sayHello,你实际做的是调用window.sayHello,所以this设置为window

于 2013-03-29T07:46:06.640 回答