我真的懂 this 嗎

2021-09-24 07:35:23 字數 2162 閱讀 7378

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 即...