Call、 apply 區別,原生實現 bind Call、apply、bind都是改變this指向的,其中call的話是通過第一個參數來 改變this指向,函數在傳參的時候一個一個進行傳參,apply也是通過第一個參 數改變this指向,函數傳參的時候通過數組或是一組的形式進行傳參,而且他 只能用於函數的調用時候,而bind呢不能用於函數的標準調用傳參,只能是事 件或是方法的後邊進行改變this的指向
他們都是用來改變this指向的。
call:改變this指向 函數被執行了
call(上下文環境,參數)
上下文環境:就是我們想到call的對象
第二個是用來傳參數 的 我們同事也要在上面的函數上面來接收 然後返回的就是 我們傳遞過去的參數。
var msg="今天吃了個雞腿";
var obj={
msg:"今天有點兒不開心"
}
function getData(data){
//在這裏 我們接收傳遞過來的參數後 賦值給msg返回回來的時候 也是可以的
this.msg=data;
return this.msg
}
//如果我們不用call的話 他就會默認找到window
//第一個是我們要改變的對象,第二個是我麼要傳遞的參數
var data=getData.call(obj,"哈哈");
console.log(data);//結果返回的是“哈哈”
// 全局調用的話我們的this指向等於window
// 我們如何能讓我們this指向當前這個函數
// 我們需要用到call 想上面這樣 可以改變this指向
apply :
和call相似度很高!!! 有一點注意的是 我們要用數組來進行傳參
var msg="今天吃了個雞腿";
var obj={
msg:"今天有點兒不開心"
}
function getData(data){
this.msg=data;
return this.msg
}
var data=getData.apply(obj,["哈哈"]);
console.log(data);
// 我們在使用apply時候報錯了
// 告訴我們要創建一個類數組,只需要給我們傳遞過去的數據 用數組括起來皆可以啦
特點也同上!!改變了this指向 也能函數 執行
bind :
能改變this指向但是:
bind時候 後臺給我們返回了一個函數,但是這個函數並未執行
ƒ getData(data){
this.msg=data;
return this.msg
}
在reach中我們通常用bind來改變 this指向。
如何讓函數被執行 只需要在後面加一個小括號
要用兩個小括號 來 調用
var msg="今天吃了個雞腿";
var obj={
msg:"今天有點兒不開心"
}
function getData(data){
this.msg=data;
return this.msg
}
//在這裏面我們 用一個小括號 來實現函數的執行
//這一 bind也不能用數組傳參 是 逗號的方式傳參
var data=getData.bind(obj,"哈哈")();
console.log(data);