0

我正在努力提高我的 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,即使我们没有定义它(或引用它)。

因此,难道不能说,实际上作为函数的调用就是作为方法的调用吗?或不?

4

1 回答 1

0

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

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(未定义);

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

于 2014-03-04T14:35:17.553 回答