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
不返回任何内容,因此它将为undefined
。 go
打印的值为obj
。
我不明白的是,为什么我(obj.go)()
打印的this
是obj
而不是window
?
考虑到其他代码的工作方式,我希望这段代码像这样工作:
obj.go
首先在括号内求值,然后该函数作为IIFE (function() { console.log(this); })()
运行。因此,由于未将函数作为obj
的方法来调用,因此this
默认为window
。
答案 0 :(得分:4)
(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
的特定obj
的绑定