对此问题进行跟进,call javascript object method from html。我在Firebug中调试它。
function Fred() {
this.a = 1;
function foo() {
if (a == 1) {
a++;
}
var e = 0;
}
this.bar = function () {
var a = 3;
foo();
};
}
从HTML文件中,我创建了Fred
的新实例并调用bar()
。在Firebug中,在调用bar()
时,我可以在观看视图中看到this
是我的Fred
实例。当bar()
调用foo()
时,this
会更改为Window
的实例。我原以为this
保持不变。
也许更多关于闭合的补救培训。
答案 0 :(得分:4)
在JavaScript中,如果你调用一个函数,this
指向的事实取决于调用的上下文。
如果将函数称为函数,即:
foo();
然后this
将引用全局上下文,在浏览器中表示window
对象。
相反,如果你调用一个类似函数的函数,即:
x.foo();
然后this
将引用您调用该函数的对象,即x
。
如果您想将某个功能作为一项功能调用,并更改this
所指的内容,则可以使用call
或apply
功能,例如
foo.call(x);
foo.apply(x);
两者都做同样的事情:调用foo
,好像它被称为x
上的方法一样。它们之间的区别在于您希望移交参数:call
要求您将它们指定为以逗号分隔的列表,而apply
则允许您移交数组:
foo.call(x, p1, p2, p3, ...);
foo.apply(x, [ p1, p2, p3, ... ]);
为了完整起见,甚至还有this
可能存在的第四种选择:如果将函数作为构造函数调用,this
指向新创建的对象:
new foo();
为了让每个人都明白这一点,在JavaScript中你有最佳实践来启动一个函数的名称,该函数充当带有大写字母的构造函数,即:
new Foo();
然而,效果保持不变。
答案 1 :(得分:2)