3

跟进这个问题,从 html 调用 javascript 对象方法。我在 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 视图中看到this我的Fred实例。bar()调用时foo()this更改为 的实例Window。我本来希望this保持不变。

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

4

2 回答 2

4

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

函数调用模式

如果将函数调用为函数,即:

foo();

thenthis将引用全局上下文,这在浏览器中表示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();

尽管如此,效果保持不变。

于 2013-03-01T20:36:13.713 回答
2

使用.call().apply()

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

例如

this.bar = function () {
    var a = 3;
    foo.call(this);
};
于 2013-03-01T20:31:42.473 回答