1. 程式人生 > >每日一則(2):call apply bind

每日一則(2):call apply bind

他們最重要的作用就是改變this指向,但是三個方法有相同之處也有不用之處,俺就來小小的總結下嘍。

call和apply

1.call

作用:

  • 1.呼叫函式(如果不傳引數的話,就跟普通呼叫是一致的)

    function foo(){
    console.log("holle!")
    }
    foo.call(null(用來告訴不需要改變this指向),1,2);
  • 2.改變所呼叫函式中this指標的指向後,再次呼叫該函式,他的指向就又是window了,意思就是他們只能改變當前繫結的函式中的this 不是永久性的改變,再次呼叫原函式 ,this指向就恢復了。

    function foo
    (){
    this.nam } var obj ={ info:“tom”; } foo.call(obj);

    這個時候的this就是obj

  • 3.借用別的物件的方法

2.apply

作用:

  • 1.呼叫函式(如果不傳引數的話,就跟普通呼叫是一致的)

    function foo(){
    console.log("holle!")
    }
    foo.apply(null(用來告訴不需要改變this指向),【1,2】);
  • 2.改變所呼叫函式中this指標的指向後,再次呼叫該函式,他的指向就又是window了,意思就是他們只能改變當前繫結的函式中的this 不是永久性的改變,再次呼叫原函式 ,this指向就恢復了。

    function foo(){
    this.nam
    }
    var obj ={
    info:“tom”;
    }
    foo.apply(obj);

    這個時候的this就是obj

  • 3.借用別的物件的方法
    例如求陣列中的最大值
var arr=[1,2,3,21,55,55].
var man=Math.max.apply(null,arr);

陣列中沒有max這個方法,通過apply來借用下max方法給陣列用。

3.兩者的區別

他們的作用是完全相同的,唯一區別在於傳遞引數的時候。
call的引數是單個的
apply的引數是一個數組

4.什麼時候用null,什麼時候不用

  • 當你要借用別的物件的方法的時候,就要必須寫null
  • 如果是直接傳遞普通引數,就必須寫null
  • 如果傳遞物件就是改變他的this指向 就不用寫null

bind(ES5提供的api)

作用

  • 1.改變this指向
  • 2.他也可以傳遞引數的(從引數的層面,跟call像)

注意

  • 執行的時候並不呼叫函式
  • 他會返回一個新的函式,這個新的函式的內部的this指標已經改變,改變成傳遞進去的那個物件,原函式的this指向是不變的。

應用場景

setinterval((functionab){
console.log(this.info);
console.loga+b);
}).bind({info:“jrye”},1,1),1000

setinterval呼叫的函式,不是bind呼叫的

為了檢測以下你是不是真的認真思考我的每一句話,給您出個小題目,做做看吧。

 function Foo(){
        console.log(this.info)
    }
    Foo.bind({info:"holle"})();
    Foo();
    var fn= Foo.bind({info:"holle"});
    fn();

分別會輸出什麼?

holle
undefined
holle

做錯的小朋友再仔細看看內容哦,大神就莫要見笑了。有錯誤的地方歡迎指出哦,俺需要你們。