在javascript方法调用中更改“this”?

时间:2013-03-01 20:26:28

标签: javascript html object

对此问题进行跟进,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保持不变。

也许更多关于闭合的补救培训。

2 个答案:

答案 0 :(得分:4)

在JavaScript中,如果你调用一个函数,this指向的事实取决于调用的上下文。

函数调用模式

如果将函数称为函数,即:

foo();

然后this将引用全局上下文,在浏览器中表示window对象。

方法调用模式

相反,如果你调用一个类似函数的函数,即:

x.foo();

然后this将引用您调用该函数的对象,即x

调用/应用调用模式

如果您想将某个功能作为一项功能调用,并更改this所指的内容,则可以使用callapply功能,例如

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)

使用.call().apply()

第一个参数说明将调用以下函数的上下文。 e。

this.bar = function () {
    var a = 3;
    foo.call(this);
};