obj = {
go: function() { alert(this) }
}
obj.go(); // object
(obj.go)(); // object
(a = obj.go)(); // window
(0 || obj.go)(); // window
谁能解释一下为什么后两个打印窗口对象而前两个打印参考。
obj = {
go: function() { alert(this) }
}
obj.go(); // object
(obj.go)(); // object
(a = obj.go)(); // window
(0 || obj.go)(); // window
谁能解释一下为什么后两个打印窗口对象而前两个打印参考。
当你直接执行一个方法时,就像最后两种形式一样,this
指针没有设置为对象。当不在严格模式下时,它被设置为window
(在严格模式下,它会被设置为 undefined 以帮助您捕获错误)。this
指针是根据您在 javascript 中调用某些内容的方式设置的 。
始终确保相应this
设置指针的最简单方法是始终在对象的上下文中调用该方法,例如:
obj.go();
这里有些例子:
obj.method() // this in method automatically set to obj
var a = obj.method();
a(); // this set to window as no object context is provided
var a = obj.method();
a.call(obj) // this explicitly set to obj by .call()
a.apply(obj) // this explicitly set to obj by .apply()
您应该记住的是,这obj.go
只是 javascript 中的一个函数,最初存储为obj
. 但是,一旦您获得了该属性值,它就只是一个函数指针,不再与任何特定对象有任何显式关联。this
如果您希望在方法内适当地设置指针,则必须在如何调用它时为其提供与对象的关联。这与其他一些语言不同,并且与 JS 中的许多不同之处一样,它既可以是您可以利用的功能,也可以是偶尔令人困惑的学习方式。