括号如何影响JavaScript中的代码?

时间:2019-05-17 23:00:50

标签: javascript this parentheses

var obj, method;

obj = {
  go: function() { console.log(this); }
};

(method = obj.go)()

注意:Fyodor对他的回答的第一个评论是对我最大的帮助。正如主题所暗示的,这更多地是括号而不是this

在最后一行中,我了解到,括号将强制内部代码首先运行,因此method采用go属性的值,该属性是一个函数。

然后()调用该函数,由于未将window作为方法调用,因此将其记录到控制台。

如果您执行(method = obj.go)()而不是method = obj.go(),它将首先运行go函数,而method将使用它返回的值。由于go不返回任何内容,因此它将为undefinedgo打印的值为obj

我不明白的是,为什么我(obj.go)()打印的thisobj而不是window

考虑到其他代码的工作方式,我希望这段代码像这样工作: obj.go首先在括号内求值,然后该函数作为IIFE (function() { console.log(this); })()运行。因此,由于未将函数作为obj的方法来调用,因此this默认为window

1 个答案:

答案 0 :(得分:4)

(method = obj.go)()分两步进行评估。

    计算
  1. method = obj.go,并且method var等于对象go的函数obj。 JavaScript中的函数可以称为方法或函数,因此通常它与您如何定义函数go无关。

  2. 然后调用method()。由于您没有提供this的值(通过调用method作为某些对象的方法或使用bindcall来提供值,因此会用this进行调用设置为全局对象(在非严格模式下)或undefined(在严格模式下)

调用obj.go()this等于obj(类似于使用obj.go.call(obj)method.call(obj))。如果仅调用method() this等于全局对象(类似于调用obj.go.call(window)

编辑

要在您的示例中将obj用作this,您可以这样做

(method = obj.go.bind(obj))()

通过这种方式,您不仅可以将go函数分配给变量method,还可以创建对等于this的特定obj的绑定

很好地了解function invocation and this in JavaScript