天天看點

call和apply和bind的差別

在 javascript 中,call 和 apply 都是為了改變某個函數運作時的上下文(context)而存在的,換句話說,就是為了改變函數體内部 this 的指向。

JavaScript 的一大特點是,函數存在「定義時上下文」和「運作時上下文」以及「上下文是可以改變的」。

apply(): 将函數作為指定對象的方法來調用,傳遞給它的是指定的參數數組

function.apply(thisobj, args) 或者 function.apply(thisobj, args)

1、thisobj是調用function的對象,函數體内thisobj為this,如果參數為null則使用全局對象

2、傳回調用函數function的傳回值

bind(): 主要作用:将函數綁定到一個對象,傳回一個新函數,通過可選的指定參數,作為指定對象的方法調用該方法

文法 fun.bind(thisArg[, arg1[, arg2[, ...]]])

function.bind(A) 或者是function.bind(A, args...);

1、A要綁定在函數上的對象

2、args...要綁定在函數上的零個或者是多個函數值

3、傳回一個新函數,該函數會當做A的方法調用,并向它傳入args參數

bind是ES5新增的一個方法

傳參和call或apply類似

不會執行對應的函數,call或apply會自動執行對應的函數

傳回對函數的引用

call(): 類似apply,将函數作為指定對象的方法來調用,傳遞給它的是指定參數

function.call(thisobj, args.....)

1、thisobj是調用function的對象,函數體内thisobj為this,如果參數為null則使用全局對象

2、傳回調用函數function的傳回值

apply與call的差別:

function print(a,b,c,d){
                alert(a + b + c + d);
            }        
            function example(a,b,c,d){
                //當參數很明确,一般使用call
                print.call(this,a,b,c,d);            
                //封裝成數組
                print.apply(this,[a,b,c,d])            
                //javascript方法本身有的arguments數組,當參數不明确的時候可以用apply結合arguments
                print.apply(this,arguments)
            }        
            example("心","想","事","成")     
        </script>      
var func = function(arg1, arg2) {
     
};
就可以通過如下方式來調用:
func.call(this, arg1, arg2);
func.apply(this, [arg1, arg2])      

三者差別demo:

<script type="text/javascript">
            var obj = {
                num: 888,
            };
            var foo = {
                getNum: function() {
                    return this.num;
                }
            }
            console.log(foo.getNum.bind(obj)()); //888
            console.log(foo.getNum.call(obj)); //888
            console.log(foo.getNum.apply(obj)); //888
            //apply 、 call 、bind 三者都是用來改變函數的this對象的指向的;
            //apply 、 call 、bind 三者第一個參數都是this要指向的對象,也就是想指定的上下文;
            //apply 、 call 、bind 三者都可以利用後續參數傳參;
            //bind 是傳回對應函數,便于稍後調用;apply 、call 則是立即調用 。      

繼續閱讀