this 實際上是在函式被呼叫時發生的繫結,它指向**完全取決於函式在**被呼叫。第一題
function
foo()
var obj =
var bar = obj.foo
obj.foo()
bar()
複製**
問: 最後兩個列印出什麼?
第二題
function
foo()
var obj =
var obj2 =
var obj3 = obj2.obj.foo
obj2.obj.foo() // 2
obj3() //undefined
複製**
問: 最後兩個列印出什麼? 答?
什麼是預設繫結呢?上**先
var a = 2;
function
foo()
function
foo2
()foo() // 2
foo2() // typeerror: cannot read property 'a' of undefined
複製**
預設繫結總結:預設繫結即不帶任何修飾的函式引用被呼叫時的繫結,此時 this 繫結到「 全域性物件 window 」或者 「undefined」
隱式繫結是什麼呢?隱式的繫結
當函式引用有上下文物件時,隱式繫結會把函式呼叫中的 this 繫結到這個上下文物件。那麼回到面試題
2.1 面試題一
function
foo()
var obj =
var bar = obj.foo
obj.foo() //2
bar() /undefined
複製**
foo() 被呼叫時,落腳點指向 obj 物件(上下文物件),所以 this 繫結到 obj ,this.a 即 obj.a , 所以列印出了 2
但是為什麼 bar() 列印出了 undefined 呢?
雖然 bar 是 obj.foo 的引用,但實際上是 foo函式 本身的引用,所以此時 bar() 是不帶任何修飾的函式呼叫,使用預設呼叫
2.2 面試題二
function
foo()
var obj =
var obj2 =
var obj3 = obj2.obj.foo
obj2.obj.foo() // 2
obj3() //undefined
複製**
跟上面一題相同,雖然引用鏈比較長,但是最後 foo() 是在 obj 中被呼叫,所以 this 繫結到 obj ,引用鏈只有最後一層影響呼叫位置。
隱式繫結總結 : 函式在上下文物件中呼叫時, this 繫結到 上下文物件上。
mdn三者的用法
3.1 call 的使用
回到面試題第一題,我們使用「 call 」進行顯式繫結
function
foo()
var obj =
var bar =obj.foo
obj.foo() // 2
bar.call(obj) //2
複製**
此時兩者都列印出 2 ,因為我們將 this 繫結到 obj ,列印出的即是 //2
3.3 bind 是 繫結第乙個引數是 this使用 new 來呼叫函式, 到底做了什麼 ?
function foo(a)
var bar = new foo(2)
console.log(bar.a) // 2
複製**
分析: 使用 new 呼叫 foo() 時,我們構造乙個物件並把它繫結到 foo() 呼叫的 this 上
####new 繫結總結: new 繫結中 this 繫結的就是新生成的物件
後記
你要是看不懂我也沒辦法了,我的修為都在這了。。。。
以上。
你真的懂迴圈嗎
好了今天我來講講什麼是迴圈吧,你又真的懂迴圈嗎?讓我來講講迴圈的細節吧和判斷吧 1 for迴圈樣式 for var i 0 i 5 i 它的條件表示式就是先寫for 在寫內部的條件,在js中宣告變數也是可以不加var直接就可以 for i 0 i 5 i 但這樣寫也有一點不對,因為i時區域性變數最好...
你真的懂程式設計嗎?
還記得自己剛學習程式設計的時候,是在大一學習c語言的時候,那時在學習程式設計的時候,一遇到一些問題就開始在網上或者書上找有沒有現成的程式。找到後就把它們稍作修改從而實現自己想要的功能,以為這就是程式設計。到後面自己學習微控制器程式設計的時候也是這樣,雖然我可以實現功能。但是就是感覺自己其實也沒做多少...
你真的懂素數嗎?
素數 即質數 定義 大於1的自然數中,除了1和此整數自身外,沒法被其他自然數整除的數 即除了1和本身沒有其他因子 首先,我們先來看乙個數與其因子有什麼關係 除了本身的因子 因子 數本身 2 如10 的因子 1 2 5 因為2 5 10 5是10的1 2 如果a因子大於5,則b因子就必須是 1,2 即...