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

标签 javascript this parentheses

var obj, method;

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

(method = obj.go)()

注意:费奥多尔对其答案的第一条评论对我帮助最大。正如主题所示,这更多的是关于括号而不是 this

最后一行,我的理解是括号会强制里面的代码先运行,所以method采用go属性的值,即一个函数。

然后,() 调用该函数,该函数将 window 记录到控制台,因为它不是作为方法调用的。

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

我不明白的是,为什么如果我这样做 (obj.go)() 打印的 thisobj 而不是窗口

考虑到其他代码的工作原理,我希望这段代码的工作方式如下: 首先在括号内评估 obj.go,然后该函数作为 IIFE (function() { console.log(this); })() 运行。因此,由于该函数不是作为 obj 的方法调用的,因此 this 默认为 window

最佳答案

(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) )

编辑

并获得objthis用你的例子你可以这样做

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

这样你不仅分配 go函数到变量method但创建到特定 this 的绑定(bind)等于 obj

很好地阅读了function invocation and this in JavaScript

关于javascript - 括号如何影响 JavaScript 中的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56194514/

相关文章:

javascript - 如何动态地将值从下拉列表传输到数据表?

html - 为什么使用 this.src 时此图像不会在鼠标悬停时发生变化?

c++ - 为什么没有 'this_class' - 'this' 的静态等价物?

swift - lazy var 定义后的括号是做什么用的?

javascript - 当尝试使用 "TypeError: Cannot read property ' 调用同一页面对象类中的方法时,Cypress 测试返回 'this' 应该“未定义”

javascript - 如何使用 dataLayer 向 google 标签管理器发出 http 请求?

javascript - 为什么这里需要 'this' 关键字?它指的是什么?

c# - 有人可以解释这种语法的各个部分,以及如何使用它吗?

java - 后缀到中缀 - 括号

javascript - 为什么我的窗口调整大小事件监听器不起作用?使用 Three.js 和 Vuetify.js