Javascript—对象内的调用函数';s方法绑定';这';到全局对象

Javascript—对象内的调用函数';s方法绑定';这';到全局对象,javascript,scope,this,Javascript,Scope,This,我读过的所有文章和书籍都说,无论我在哪里定义函数,都是在哪里调用函数来决定“this”绑定到哪个对象。但在这个例子中,我不明白为什么“this”绑定到全局对象 function foo(){ console.log(this); } var obj = { myMethod: function() { foo(); } }; obj.myMethod(); 据我所知,“obj”对象是

我读过的所有文章和书籍都说,无论我在哪里定义函数,都是在哪里调用函数来决定“this”绑定到哪个对象。但在这个例子中,我不明白为什么“this”绑定到全局对象

    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’绑定到哪个对象。”,严格来说这不是真的。
    的值(通常)是定义函数的对象,因此从这个意义上讲,定义函数的位置非常重要。“此值(通常)是定义函数的对象”---那不是真的。函数最初定义在哪里并不重要。它仍然只关系到你如何调用:好的,是的,“它最初定义在哪里”并不重要。我把一个方法属性的位置描述为“它定义在哪里”。你指的是“它是如何执行的”(我第一次认为你的意思是打电话、申请等)因此,我认为我已经找到了最不含糊的快乐媒介。我将再次更新答案:-)