Javascript—对象内的调用函数';s方法绑定';这';到全局对象
我读过的所有文章和书籍都说,无论我在哪里定义函数,都是在哪里调用函数来决定“this”绑定到哪个对象。但在这个例子中,我不明白为什么“this”绑定到全局对象Javascript—对象内的调用函数';s方法绑定';这';到全局对象,javascript,scope,this,Javascript,Scope,This,我读过的所有文章和书籍都说,无论我在哪里定义函数,都是在哪里调用函数来决定“this”绑定到哪个对象。但在这个例子中,我不明白为什么“this”绑定到全局对象 function foo(){ console.log(this); } var obj = { myMethod: function() { foo(); } }; obj.myMethod(); 据我所知,“obj”对象是
function foo(){
console.log(this);
}
var obj = {
myMethod: function() {
foo();
}
};
obj.myMethod();
据我所知,“obj”对象是调用函数的对象,因此“this”应该绑定到“obj”,但结果是window对象。有人能给我解释一下吗?创建foo()时,它是用闭包创建的。当它被调用时,它仍然通过创建它的闭包记住它的作用域,当时,它被绑定到全局对象。
这是JavaScript中的一个奇怪的野兽,所以您最好阅读一下
function foo(){
console.log(this);
}
var obj = {
myMethod: function() {
foo();
}
};
obj.myMethod();
但总而言之,函数最初定义在哪里并不重要,重要的是它执行的位置
如果函数是全局定义的,并且您使用myFunction(x)
调用它,那么它将在全局范围内执行,this
将引用全局对象(正如您在foo()
函数中发现的,this
是窗口对象)
如果函数包含在对象的属性中,则此
将引用包含该属性的对象。(包含函数的对象属性称为“方法”)
例如
myFunction = function() { console.log(this); }
myObject = {
myMethod: myFunction
}
myFunction(x) // `this` == the global window object.
myObject.myMethod(x) // `this` == `myObject`
注1。您还可以使用“调用”、“应用”和“绑定”调用函数
这使您能够指定此
在函数运行时应在函数内部引用的内容。(请在我提供的链接上详细阅读。)
附注2。ES6“arrow function”语法(
(x)=>{…}
)是一个例外,因为此
将始终与此
在定义arrow函数本身的任何位置具有相同的值。您正在从myMethod
中调用foo
,因此它不是obj
直接调用foo
。要使此
指向obj
,您应该将foo
直接指定给myMethod
e、 g
函数foo(){
console.log(this);
}
var obj={
我的方法:foo
};
obj.myMethod()代码>重要的是如何调用函数,而不是在何处。你说:“我读的所有文章和书籍都说[…]”-如果你在帖子中添加一些书籍的链接和引用(包括标题),那就太好了。”要理解这种绑定,我们必须了解调用站点:调用函数的代码位置(不是在声明的地方)“-你不知道JS电子书第172页定义函数的地方并不重要。重要的是如何调用它。OP的理解是“我在哪里定义函数并不重要,是在哪里调用函数决定‘this’绑定到哪个对象。”,严格来说这不是真的。此
的值(通常)是定义函数的对象,因此从这个意义上讲,定义函数的位置非常重要。“此值(通常)是定义函数的对象”---那不是真的。函数最初定义在哪里并不重要。它仍然只关系到你如何调用:好的,是的,“它最初定义在哪里”并不重要。我把一个方法属性的位置描述为“它定义在哪里”。你指的是“它是如何执行的”(我第一次认为你的意思是打电话、申请等)因此,我认为我已经找到了最不含糊的快乐媒介。我将再次更新答案:-)