-
用new調用函數, this指向新創建的對象。
-
使用call,apply(bind)調用函數, this指向綁定的的對象。
-
函數作爲某對象的屬性調用, this指向這個對象。
-
其他情況下, this指向全局對象(嚴格模式下指向undefined)。
補充: 如果第二條規則綁定的是null或者undefined, 則執行第四條規則; 1-4條規則優先級遞減。
var a = 1;
var foo1 = {
a: 2,
bar: function(){
console.log(this.a)
}
};
var foo2 = {
a: 3
};
var baz = foo1.bar;
baz() // 1 規則4
foo1.bar() // 2 規則3
foo1.bar.call(foo2) // 3 規則2>規則3
new foo1.bar() // undefined 規則1>規則3
var baz2 = foo1.bar.bind(foo2);
new baz2() // undefined 規則1>規則2
foo1.bar.call(null) // 1 this指向global
參考:You Don't Know JS: this & Object Prototypes