按照優先級的有先后順序判斷this的指向:
1.函數是否在new中調用(new綁定)?如果是的話this綁定的是新創建的對象.
var bar = new fun()
2.函數是否用過call\apply(顯式綁定)或者硬綁定(bind)調用?如果是的話,this綁定的是指定的對象.
var bar = fun.call(obj)
3.函數是否在某個上下文對象中調用(隱式綁定)?如果是的話,this綁定的是那個上下文對象.
var bar = obj.foo()
4.如果都不是的話,使用默認綁定.如果在嚴格模式下,就綁定到undefined,否則綁定到全局對象.
var bar = foo()
-------------------------------我是分割線----------------------------------
var foo = {
func1: function (bar){
bar();//輸出window, 而不是foo
console.log(this);// 這里的this關鍵字是foo對象的一個引用}
}
foo.func1(function(){console.log(this)})
當this值的宿主函數被封裝在另一個函數的內部或在另一個函數的上下文中被調用時,this值將永遠是對head對象的引用(this在ES5中是固定的).