为什么在这两种情况下这个引用的关键字是不同的?

时间:2014-03-31 23:56:01

标签: javascript

第一个代码

var object1 = {name: "my object", 
               ha: function() {
                      return this;
                   }
              }

object1.ha()  #=> Object {name: "my object", ha: function}

第二个代码

var object2 = {name: "my object2", 
               ha2: function() {
                      return function() {
                               return this;
                             }
                    }
              }

object2.ha()()  #=> window

2 个答案:

答案 0 :(得分:4)

因为object2中的this通过放置在匿名函数中而丢失了父对象的上下文,并且默认绑定到全局对象,在浏览器中,该对象是window

您可以通过本地化对象引用来补救它:

var object2 = {
    name : "my object2", 
    ha2  : function() { 
        var _this = this; // <-- here
        return function() { 
            return _this;
        } 
    } 
}

答案 1 :(得分:1)

因为this不是变量,所以它是一个在运行时解析其值的关键字。它解析为最近的绑定对象,创建其范围。当您习惯于静态解析此语言的其他语言时,这会令人困惑。在您的示例中,运行函数时最近的绑定对象是窗口。