作为对象和函数调用

时间:2013-03-29 07:31:43

标签: javascript function

我正在读这个 - 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,但我们省略了括号以便不显式调用函数?为什么我们需要它们?如果我们省略它们,我们不会得到相同的结果,它不会再次“在运行时附加到对象的函数”吗?

3 个答案:

答案 0 :(得分:3)

  

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

  

但我们省略了括号,以便不显式调用函数?

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

  

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

如果省略这两行,则myObject.sayHello将为undefined,当您尝试拨打undefined()时,您会收到错误。

答案 1 :(得分:1)

var sayHello = function() {
    ...
};
myObject.sayHello = sayHello;

与:

相同
var myObject = {
    myName: "Rebecca",
    sayHello: function() {
        ...
    }
};

答案 2 :(得分:1)

发生的事情是您将myObject.sayHello指向sayHello函数(并省略了括号,否则您将分配被调用函数的结果)。每当您拨打sayHello功能时,this将成为您呼叫sayHello的对象。

因此对于myObject.sayHellothis将为myObject

只需拨打sayHello,您实际执行的操作就是调用window.sayHello,因此this设置为window