【问题标题】:JavaScript: invocation as a function/methodJavaScript:作为函数/方法调用
【发布时间】:2014-03-04 22:35:17
【问题描述】:

我正在努力提高我的 JavaScript 技能,并且我知道调用函数有四种基本方法——它们改变了 this 的定义方式。我感兴趣的两个是基本的两个:

  • 作为函数调用
  • 调用作为方法

这很好。第一个,this 将引用window 对象:

function doSomething() {
    console.log(this);
}

doSomething(); // window is logged

第二个this 将引用它正在从内部执行的对象:

var t = {
    doSomething: function () {
        console.log(this);
    }
};

t.doSomething(); // t is logged

这一切都很好。但是,是否正确地说,在这两个调用方法中,this 总是会返回包含该方法的对象(如果这有意义的话)?

在第一个示例中,doSomething() 实际上是在 window 对象中定义的 - window 对象的属性也是如此,即使我们没有定义它(或引用它)。

那么,难道不能说实际上作为函数的调用就是作为方法的调用吗?还是不行?

【问题讨论】:

  • 参考:使用'use strict';,第一个示例将记录undefined
  • 它只是关于 this 指针。如果你在object 中声明一个函数,那么我们可以说它是一个方法调用,因为函数现在是对象的一部分,它被定义为方法。此外,this 在这种情况下指向对象。如果您在窗口中(或不在对象内)声明一个函数,那么它的函数调用,因为现在this 指向窗口。

标签: javascript invocation


【解决方案1】:

想象一下定义你的函数,而不是像你所做的那样在全局对象的范围内,而是在另一个函数的范围内:

function outer() {
    var inner = function(){console.log(this)};
    inner();
};
outer();

你认为 this 会绑定什么?会打印什么?

您可能认为它将是 外部 函数对象,但事实证明它始终是全局对象。

就像你写的一样:

function outer() {
    var inner = function(){console.log(this)};
    inner.call(window);
};
outer();

这是一个非常危险且远非直观的 JS“功能”。

所以,回到你的第一个例子,你所做的基本上是这样的:

doSomething = function () {
    console.log(this);
}
doSomething().call(window);

而且,就像 Yoshi 指出的那样,如果你使用 ES5 的严格模式,你最终会做类似的事情,在我看来,危险性要小得多:

doSomething().call(未定义);

它也给你一个强烈的暗示,你不应该在函数中使用 this ;)

【讨论】:

    猜你喜欢
    • 2017-07-11
    • 2017-09-18
    • 2016-06-09
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    相关资源
    最近更新 更多