跟进这个问题,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()
时,我可以在 Watch View 中看到 this
是我的 Fred
实例。当 bar()
调用 foo()
时,this
更改为 Window
的实例。我希望 this
保持不变。
也许更多关于关闭的补救培训。
最佳答案
在 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();
尽管如此,效果还是一样。
关于javascript - 在 javascript 方法调用中更改 'this'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15166281/