this 其實是在函數被調用時發生的綁定,它指向哪裏徹底取決於函數在哪裏被調用。面試
function foo(){
console.log(this.a)
}
var obj = {
a :2,
foo:foo
}
var bar = obj.foo
obj.foo()
bar()
複製代碼
問: 最後兩個打印出什麼?數組
function foo(){
console.log(this.a)
}
var obj = {
a :2,
foo:foo
}
var obj2 = {
a:1,
obj:obj
}
var obj3 = obj2.obj.foo
obj2.obj.foo() // 2
obj3() //undefined
複製代碼
問: 最後兩個打印出什麼? 答?bash
什麼是默認綁定呢?上代碼先app
var a = 2;
function foo(){
console.log(this.a)
}
function foo2(){
'use strict'
console.log(this.a)
}
foo() // 2
foo2() // TypeError: Cannot read property 'a' of undefined
複製代碼
默認綁定總結:默認綁定即不帶任何修飾的函數引用被調用時的綁定,此時 this 綁定到「 全局對象 window 」或者 「undefined」函數
當函數引用有上下文對象時,隱式綁定會把函數調用中的 this 綁定到這個上下文對象。ui
那麼回到面試題this
function foo(){ console.log(this.a)}
var obj = { a :2, foo:foo }
var bar = obj.foo
obj.foo() //2
bar() /undefined
複製代碼
foo() 被調用時,落腳點指向 obj 對象(上下文對象),因此 this 綁定到 obj ,this.a 即 obj.a , 因此打印出了 2spa
可是爲何 bar() 打印出了 undefined 呢?prototype
雖然 bar 是 obj.foo 的引用,但其實是 foo函數 自己的引用,因此此時 bar() 是不帶任何修飾的函數調用,使用默認調用code
function foo(){ console.log(this.a) }
var obj = { a :2, foo:foo }
var obj2 = { a:1, obj:obj }
var obj3 = obj2.obj.foo
obj2.obj.foo() // 2
obj3() //undefined
複製代碼
跟上面一題相同,雖然引用鏈比較長,可是最後 foo() 是在 obj 中被調用,因此 this 綁定到 obj ,引用鏈只有最後一層影響調用位置。
使用「 call apply bind 」 進行綁定 this , this 綁定到第一個傳入的參數
回到面試題第一題,咱們使用「 call 」進行顯式綁定
function foo(){ console.log(this.a) }
var obj = {
a :2,
foo:foo
}
var bar =obj.foo
obj.foo() // 2
bar.call(obj) //2
複製代碼
此時二者都打印出 2 ,由於咱們將 this 綁定到 obj ,打印出的便是 //obj.a //2
function foo(a){
this.a = a
}
var bar = new foo(2)
console.log(bar.a) // 2
複製代碼
分析: 使用 new 調用 foo() 時,咱們構造一個對象並把它綁定到 foo() 調用的 this 上
####new 綁定總結: new 綁定中 this 綁定的就是新生成的對象
2 . 「 new 綁定 」函數是否在 new 中調用 ? 若是是 this 綁定的便是 新建立的對象。 var bar = new foo()
4.「 隱式綁定 」 函數是否在某個上下文中調用? 是的話,this 綁定的是那個上下文對象 var bar = obj.foo()
後記
你要是看不懂我也沒辦法了,個人修爲都在這了。。。。
文章爲我的總結,不足之處還請留言或私信。
轉載請註明出處。
以上。