我以为我正在处理this
的工作方式,但本例中的几行代码让我感到困惑:
function Bar(who) {
Foo.call( this, who );
}
我对call()
的作用有一个合理的理解,但我无法理解为什么在这个确切的例子中有必要。为什么以下代码不起作用?
function Bar(who) {
Foo( who );
}
Foo
的呼叫网站仍然不在Bar
内,因此this
将是new
呼叫创建的对象吗?
完整代码:
function Foo(who) {
this.me = who;
}
Foo.prototype.identify = function() {
return "I am " + this.me;
};
function Bar(who) {
Foo.call( this, who );
}
Bar.prototype = Object.create( Foo.prototype );
Bar.prototype.speak = function() {
alert( "Hello, " + this.identify() + "." );
};
var b1 = new Bar( "b1" );
var b2 = new Bar( "b2" );
b1.speak();
b2.speak();
感谢您在此示例中获得的任何亮点。
答案 0 :(得分:0)
当您调用函数"通常",即foo()
时,函数内的this
将引用全局对象(或严格模式下的undefined
)
Foo
的呼叫网站是否仍在Bar
内,因此这将是新呼叫创建的对象?
this
的值不(隐含地)取决于函数的调用位置。
功能上下文
在函数内部,其值取决于函数的调用方式。
简单的通话
function f1(){ return this; } f1() === window; // global object
在这种情况下,调用不会设置
this
的值。由于代码不是严格模式,this
的值必须始终是一个对象,因此它默认为全局对象。
答案 1 :(得分:0)
this
值可能变得相当复杂,但有一个非常简单的规则:
如果通过另一个对象调用该函数,则该对象将是:
something.doIt()
something
将是this
值,即使在函数之前有一些其他对象通向对象。
doIt()
由于在函数调用之前没有对象,this
将是全局对象(浏览器中的窗口),或者如果您使用"使用严格&#34,它将是null
;;
还有另一条规则。如果使用new
运算符调用该函数,则this
值将是新创建的对象。
new something.MyFunction()
将新创建的对象this
不 something
。如果你在调用真正的构造函数之前需要函数调用,比如CommonJS模块加载,你需要将第一部分包装在括号中。
new (require("./MyClass"))();
call
,apply
和bind
函数用于覆盖隐式this
值。