call,apply和bind的用法和區別


首先來看三個方法的基本語法:

1.call方法

做用: 是調用函數,專門用於修改方法內部的 this 指向,指定this能夠表明誰
例如 fn.call(obj)
意思就是 調用函數fn,而且this指向obj對象數組

call的使用語法:
函數名字.call(對象,參數1,參數2,...);
實例: 
function test(a,b){
      console.log(this);
      console.log(a + b);
  }
  test(1,2);  //  window  3
  var obj = {name:'zjy'};
  window.test.call(obj,3,5);  //  {name:'zjy'} 8

解析:沒有使用 call 方法時,test方法的this指向全局對象window,而當使用了call方法後,將test的this指向從window變成了obj對象,然後面的參數則是對應方法的形參順序app


2. apply方法

做用: 和call方法同樣也是修改方法內部的 this指向的,它們的區別在於apply的第二個參數必須爲一個數組(部署了Iterator接口的類數組對象也能夠)函數

// ?apply的使用語法
// 函數名字.apply(對象,[參數1,參數2,...]);
實例: 
    function test(a,b){
        console.log(this);
        console.log(a + b);
    }
    test(1,2);  //  window  3
    var obj = {name:'zjy'};
    window.test.apply(obj,[3,5]);  //  {name:'zjy'} 8

解析:沒有使用 apply 方法時,test方法的this指向全局對象window,而當使用了apply方法後,將test的this指向從window變成了obj對象,然後面的數組參數則是將數組中元素依次對應到test方法形參的位置this


3. bind方法

做用:改變this的指向問題, 是綁定函數的this,同時返回綁定後的新函數
例如
var fb = fn.bind(obj);
window.fb();
不管誰調用fb函數, 函數的this都會指向objcode

// ?bind的使用語法
// 函數名字.bind(對象,參數1,參數2,...);
實例:
  var obj = {key:"value"}
    var foo = function(){
        console.log(this)
    }
    foo.bind(obj)()  //  obj

解析: 解析:在沒有使用bind方法時,foo()中的this指向的是全局對象window,而使用了bind方法以後則指向的是obj對象對象

做用:前兩個都是爲了改變this指向,bind是改變this指向而且複製這個方法返回接口

總結

apply,call,bind三者的區別 :

1. 三者均可以改變函數的this對象指向。部署

2. 三者第一個參數都是this要指向的對象,若是若是沒有這個參數或參數爲undefined或null,則默認指向全局window。io

3. 三者均可以傳參,可是apply是數組,而call是參數列表,且apply和call是一次性傳入參數,而bind能夠分爲屢次傳入。console

4. bind 是返回綁定this以後的函數,便於稍後調用;apply 、call 則是當即執行 。

粗體

相關文章
相關標籤/搜索