天天看點

JavaScript-函數的call()和apply()方法

call()和apply()都是在特定的作用域中調用函數,等于設定函數體内this對象的值,以擴充函數賴以運作的作用域。

一般來說,this總是指向調用某個方法的對象,但是使用call()和apply()方法時,就會改變this的指向。

function fun(){
        console.log(this);
    }			
    fun();
           
  • 上面,當我們調用fun()函數的時候, this的指向是window
function fun(){
        console.log(this);
    }
    var obj1={
        type:"我是obj1",
        sayName:function(){
            console.log(this.type);
        }
    };
    var obj2={
        type:"我是obj2"
    };
    /*this 永遠是window*/
    fun(obj1);

    /*this是傳入的參數*/
    fun.call(obj1);
    fun.apply(obj2);

    /*正常對象裡的方法 this 指向上級function*/
    obj1.sayName();
    /*指定參數 this指向傳入的參數*/
    obj1.sayName.apply(obj2);
    </script>
           
  • 列印結果:

    Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …}

    {type: “我是obj1”, sayName: ƒ}

    {type: “我是obj2”}

    我是obj1

    我是obj2

  • 說明: fun()預設this指向window, 當我們在調用fun使用call/apply()方法,并且向方法裡面傳遞一個參數的時候, this的指向就會發生變化, 指向到傳遞過來的參數對象。
call()和apply()方法除了傳遞對象之外, 還可以傳遞函數形參,括号裡第一個是要傳遞的對象, 後面的是函數需要的參數。call()和apply()的寫法不同, call(obj,xx,xx,xx) 。 apply(obj,[xx,xx,xx])。
function fun(a,b,c){
        console.log(this);
        console.log(a+b+c);
    }
    var obj1={
        type:"我是obj1"
    };
   
    fun.call(obj1,2,3,4);
           
  • 運作結果:

    {type: “我是obj1”}

    9

繼續閱讀