javascript - 在 javascript 方法调用中更改 'this'?

标签 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() 时,我可以在 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/

相关文章:

javascript - 如何简化 jQuery 代码以突出显示区域和链接

javascript - 在 backbone.js 中声明 View 、模型等的最佳实践

javascript - 如何使 html 文件从 config.js 文件读取值

delphi - 怎样才能实现免费的Interface类呢?

javascript - Webpack:为目录中的每个文件创建一个包

javascript - Angular 2 和 LeafLet Uncaught ReferenceError : <function> is not defined at HTMLButtonElement. onclick

php - 如何设置下拉列表的样式?

PHP post 提交后抛出 404 错误

JavaScript 对象使用 .检索值

javascript - 如何将对象转换为按对象键分组