我正在读这个 - 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,但我们省略了括号以便不显式调用函数?为什么我们需要它们?如果我们省略它们,我们不会得到相同的结果,它不会再次“在运行时附加到对象的函数”吗?
答案 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.sayHello
,this
将为myObject
。
只需拨打sayHello
,您实际执行的操作就是调用window.sayHello
,因此this
设置为window
。