今天主要分享的就是兩個部分,
一個是明確的繫結,
另一個是當有多個規則能夠套用時的優先順序。
那我們開始吧
所謂的明確的繫結就只是指出你想要的 this ,對 this 而言 你可以使用 call(..)
、apply(..)
或是 ES5 提出的 bind(..)
來明確的綁定給 this 的物件,雖然他們是對 this 來說是一樣的,但是他們的行為卻會不一樣。
call 第一個參數為 this 的值,用法如下
function foo(content){
console.log(this.a);
console.log(content);
}
var obj = {
a:2
};
foo.call(obj,'Hellow world');
// 2
// 'Hellow world'
與 call 使用方式比較大的差異是後面接收的參數是陣列。
function foo(content){
console.log(this.a);
console.log(content);
}
var obj = {
a:2
};
foo.apply(obj,['Hellow world']);
// 2
// 'Hellow world'
主要用法差異在於說先綁定一個物件後,
再將後續的參數傳入。
這個其實在別人的 code 中我個人滿常見的
用法如下
function foo(content){
console.log(this.a);
console.log(content);
}
var obj = {
a:2
};
var bar = foo.bind(obj);
console.log(bar('Hellow world'))
// 2
// 'Hellow world'
在 JS 有很多函式會提供給你一個 Option 的參數(通常叫做 context ),
可以讓你使用特定的 this ,不用你自己透過 call(..)
或是 apply(..)
來做明確的繫結。(貼心到爆
例如以下範例
function foo(el){
console.log(el, this.id);
}
var obj={
id: "nice"
};
[0,1,2].forEach(foo,obj);
// 0 nice 1 nice 2 nice
最後一個規則啦!
基本上這個就很簡單你是不是有看過使用 new
建構過一個新物件,那所謂的 "new 繫結" 就是 this 會指向你 new 出來的物件。
例如下面的範例
function foo(){
this.a = a;
}
var bar = new foo(2);
console.log(bar.a) // 2
當有多個規則能夠套用時時的優先順序是誰先誰後?
以上是今天的內容,感謝您的收看 ~
明天繼續分享感恩你的收看
你所不知道的 JS|範疇與 Closures,this 與物件原型 (You Don't Know JS: this & Object Prototypes))