由bind引發的血案

2021-07-10 17:59:27 字數 1496 閱讀 3686

先來看兩個例子(瀏覽器環境,非嚴格模式下):

var a = 'win';

var obj =

};obj.say(); // obj

var say = obj.say;

say(); // win

相信上面的例子沒有任何懸念的。好了,下面懸念來了:

var a = 'win';

var obj = .bind(this) // 區別在此

};obj.say(); // ?

var say = obj.say;

say(); // ?

好好想想答案究竟是什麼。。。

。 。

。 。

。 。

。 。

。 。

。 。

。 。

。 。

。 。

。 。

。 。

。 。

。 。

答案是:

> win

> win

這表明,我們 bind 的這個 this 實際上是 全域性物件window。

這個故事告訴我們:物件中有 function 包裹的 this 才是指向物件本身的哦。。。

你以為這樣子就完了嗎?too ******!*****!放大招來了:

var a = 'win';

var obj = .bind(obj) // 把 this 換成 obj

};obj.say(); // ?

var say = obj.say;

say(); // ?

好好想想答案究竟是什麼。。。

。 。

。 。

。 。

。 。

。 。

。 。

。 。

。 。

。 。

。 。

。 。

。 。

。 。

答案還是:

> win

> win

wtf?!什麼鬼?!不是已經死死地 bind 住自身了嗎???!!!怎麼還是輸出全域性變數???!!!

這涉及到變數提公升問題,上面的**我們來解析解析:

var a, obj; // 它們都是 undefined

a = 'win';

obj = .bind(obj) // 因此,其實這裡 bind 的是 undefined。這樣的話內部的 this 就直接指向了全域性變數

};

實際上,本來我也想不到是這個原因。後來是通過簡單重寫 bind 函式來 console 才知道原因:

function.prototype.bind = function

(ctx) ;

};

由安裝yarn引發的血案

今天在mac上搞vuepress的時候,用npm安裝的出現各種問題 和webpack3.x出現的問題 所以需要安裝yarn。我用brew命令安裝的時候,報錯,沒許可權,提示用下面語句設定許可權 sudo chown r whoami usr localchown usr local operatio...

由安裝yarn引發的血案

今天在mac上搞vuepress的時候,用npm安裝的出現各種問題 和webpack3.x出現的問題 所以需要安裝yarn。我用brew命令安裝的時候,報錯,沒許可權,提示用下面語句設定許可權 sudo chown r whoami usr localchown usr local operatio...

乙個由copyBean引發的血案

一次開發中使用輪子bean互轉突然發生了問題 new setdlevel 1 dto dto new dto dto beancopyutils.copybean dto.class system.out.println dto.getdlevel 列印出輸出結果 輸出結果卻變成null,怎麼肥事呢...