1. call apply bind的作用 —- 用來改變函數中this的指向
2. call 的使用方法
call()中第一個參數:用來改變this指向
call()中從第二個參數開始,相當於給call點前面的函數,從左往右一個個的傳參;
把call點前面的函數中的this關鍵字變成call的第一個參數;
注意:如果call前面的函數中沒有this關鍵字,那麼就不需要修改,直接調用此函數即可;
把call點前面的函數調用;
例子:
var obj={name:'aaa'};
function fn(n,m){
console.log(this,(n+m)); //()用來提高優先級
}
fn.call(obj,2,3); //window的全局方法;{name: "aaa"} 5
3. apply 的使用方法
apply總共有兩個參數:1.用來改變this指向 2.把所有的實參放在一個數組中;
但是,它對apply點前面的函數進行傳參的時候,相當於給fn1的參數從左往右一個個的傳參;
例子:
var obj={};
function fn1(n,m){
alert(this+(n+m));
}
fn1.apply(obj,[2,3])
4. bind 的使用方法
bind屬於預處理機制:
bind()會提前修改後函數中的this和參數,然後返回個修改後的函數;等需要的時候,手動調用;
bind的傳參方式,跟call一樣;第一個參數改變this的指向,從第二個參數開始一個個的傳參;
例子:
var obj={};
function fn(n,m){
alert(this+(n+m))
}
var res=fn.bind(obj,2,3); //bind的傳參方式跟call 一樣;
res();//是個新地址,跟以前沒關係;
fn(2,3);
/*
* 預處理機制:
* 1.當調用bind方法的時候,會預先把fn中的this改成obj,同時如果有參數的話,也會給fn中的形參賦值
* 2.把已經修改好的fn,返回;
* 3.在我們需要的時候,手動調用;
*/
5. call,apply,和bind區別
call,apply在this被改變後,函數會立即執行;
bind屬於預處理機制:bind()會提前修改後函數中的this和參數,然後返回個修改後的函數;等我們需要的時候,手動調用;
bind的傳參方式,跟call一樣;只有apply的第二個參數是一個數組;其他的都是從第二個參數開始一個個的傳參;
6. 關於函數中的this總結
1.當元素的事件被觸發的時候,執行一個方法,方法中的this指向當前這個元素
2.自執行函數中的this,永遠是window;
3.當函數被調用的時候,點前面是誰,this就是誰;
4.構造函數中的this指向當前實例
5.回調函數中的this一般是window;
6.當遇到call,apply,bind的時候,以上規律都不適用,他們可以通過第一個參數去改變this指向;
7. 嚴格模式和非嚴格模式下的不同
嚴格模式 //”use strict”//
var obj={};
function fn(){
alert(this)
}
//在嚴格模式下,給call的第一個參數傳什麼,this指向就是什麼
fn.call(null);
fn.call(undefined);
fn.call(); //不傳也是undefined;
非嚴格模式下
fn.call();//沒有穿第一個參數,this 是window;
fn.call(null)//傳null,this也是window;
fn.call(undefined)//傳undefined,this也是window;
//apply跟call在this方面一模一樣;