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
没有返回任何内容,因此它将是 undefined
。 go
打印的值将是 obj
。
我不明白的是,为什么如果我这样做 (obj.go)()
打印的 this
是 obj
而不是窗口
?
考虑到其他代码的工作原理,我希望这段代码的工作方式如下:
首先在括号内评估 obj.go,然后该函数作为 IIFE (function() { console.log(this); })()
运行。因此,由于该函数不是作为 obj
的方法调用的,因此 this
默认为 window
。
最佳答案
(method = obj.go)()
分两步进行评估。
method = obj.go
被评估并method
var 等于函数go
对象obj
。 JavaScript 中的函数可以作为方法或函数来调用,因此一般来说,您如何定义函数go
并不重要。 .然后
method()
叫做。因为您没有提供this
的值(通过调用method
函数作为某个对象的方法,或者使用bind
或call
来调用它,并将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
的绑定(bind)等于 obj
关于javascript - 括号如何影响 JavaScript 中的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56194514/