为什么函数上下文在实例化时会发生变化?

时间:2014-01-07 10:58:02

标签: javascript

为什么foo()中的上下文在通过实例化调用时会有所不同?

此外,this是否可以在对象范围(下面的window示例)中指向容器对象(如bar)之类的内容?

function foo(){
    console.log(this === window, this);
}

var bar = {
    getBar: function(){
        console.log(this === bar);
    }
};

foo();
var f = new foo();
bar.getBar();

// Output:
// true
// false
// true

http://jsfiddle.net/RUaEA/1/

1 个答案:

答案 0 :(得分:4)

因为在函数内部,this等于全局对象,除非

  • 您正在使用new创建一个对象,在这种情况下,构造函数this内部绑定到正在创建的实例,或者
  • 调用的格式为obj.func(),在这种情况下,this将始终设置为obj
  • this已使用callapplybind
  • 明确绑定到某个值

规范未指定全局对象的值,但对于在浏览器中运行的JS,它是window对象。