我读过的所有文章和书籍都说我在定义函数的地方并不重要,而是调用决定哪个'this'对象的函数。但是通过这个例子,我不明白为什么'this'绑定到全局对象。
function foo(){
console.log(this);
}
var obj = {
myMethod: function() {
foo();
}
};
obj.myMethod();
据我所知,'obj'对象是调用函数的对象,因此'this'应绑定到'obj',但结果是window对象。有人可以帮我解释一下吗?
答案 0 :(得分:2)
this
是JavaScript中的一个奇怪的野兽,所以你最好阅读overview on MDN。
但总的来说,最初定义函数的位置并不重要,但重要的是它的执行位置......
如果函数是全局定义的并且使用myFunction(x)
调用它,那么它在全局范围内执行,而this
将引用全局对象(就像你一样)已在foo()
函数中发现this
是Window对象
如果函数包含在对象的属性中,则this
将引用包含该属性的对象。 (包含函数的对象属性称为"方法")
例如......
myFunction = function() { console.log(this); }
myObject = {
myMethod: myFunction
}
myFunction(x) // `this` == the global window object.
myObject.myMethod(x) // `this` == `myObject`
注意1.您还可以使用' call',' apply'和' bind'来调用功能。
这使您可以在运行时指定函数内部应引用的this
。 (在我提供的链接上详细了解它们。)
注意2. ES6"箭头功能"语法((x)=>{ ... }
)是一个例外,因为this
始终与this
的值相同,只要箭头函数本身已定义。
答案 1 :(得分:1)
创建foo()时,会使用闭包创建它。当它被调用时,它仍然通过它创建它的闭包来记住它的范围,那时它被绑定到全局对象。
答案 2 :(得分:0)
您从foo
内拨打myMethod
,因此obj
直接呼叫foo
。要this
指向obj
,您应将foo
直接指定给myMethod
。
e.g。
function foo() {
console.log(this);
}
var obj = {
myMethod: foo
};
obj.myMethod();