Javascript - 对象方法中的调用函数将“this”绑定到全局对象

时间:2017-07-23 05:51:50

标签: javascript scope this

我读过的所有文章和书籍都说我在定义函数的地方并不重要,而是调用决定哪个'this'对象的函数。但是通过这个例子,我不明白为什么'this'绑定到全局对象。

    function foo(){
        console.log(this);
    }
    var obj = {
        myMethod: function() {
            foo();
        }
    };
    obj.myMethod();

据我所知,'obj'对象是调用函数的对象,因此'this'应绑定到'obj',但结果是window对象。有人可以帮我解释一下吗?

3 个答案:

答案 0 :(得分:2)

this是JavaScript中的一个奇怪的野兽,所以你最好阅读overview on MDN

但总的来说,最初定义函数的位置并不重要,但重要的是它的执行位置......

  1. 如果函数是全局定义的并且使用myFunction(x)调用它,那么它在全局范围内执行,而this将引用全局对象(就像你一样)已在foo()函数中发现this是Window对象

  2. 如果函数包含在对象的属性中,则this将引用包含该属性的对象。 (包含函数的对象属性称为"方法")

  3. 例如......

    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();