先來看兩個例子(瀏覽器環境,非嚴格模式下):
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,怎麼肥事呢...