JavaScript基礎 (十二) ---- call apply bind的區別

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();//沒有穿第一個參數,thiswindow;
    fn.call(null)//null,this也是window;
    fn.call(undefined)//undefinedthis也是window//apply跟call在this方面一模一樣;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章