JS 關於 bind ,call,apply 和arguments p8

關於這3個貨,網上有不少文章介紹,我這邊仍是記錄下並加上本身的理解,還有arguments函數內置對象順便也記錄下:git

 

簡單的說apply和call 會綁定第一個參數的做用域給調用函數對象實例,並會執行調用函數,還能夠傳參數github

apply 第二個參數是數組,call 是可變長度參數express

apply、call:數組

例子來個:app

function x(t,v){
     console.log(this.id);
     if(t){
         console.log(t);
     }
     if(v){
         console.log(v);
     }
}

var id = '我是外部ID';

var obj = { id:'我是內部obj的ID' }

x(); //我是外部ID

x.apply(obj); // 我是內部obj的ID

x.call(obj); // 我是內部obj的ID

x.apply(obj,['test']);
 //     我是內部obj的ID
 //     test


x.call(obj,'test','test2');
 //     我是內部obj的ID
 //     test
 //     test2

是否是一下就明白了。ide

 

bind:函數

bind一樣會綁定,也會穿參數,可是不會當即執行性能

x.bind(obj)() ; // 我是內部obj的ID

var x_copy = x.bind(obj);
x_copy();//我是內部obj的ID

 

arguments:this

相似數組,但不是真的數組,好吧,就把它當成數組吧,它一樣擁有length 並且也能夠經過下標訪問:spa

function x(){
   console.log(arguments.length);
   
   var j = 0;
   for(let i=0;i<arguments.length;i++){
       j += arguments[i];
   }

   console.log('[j >>]',j);
} ;

x();
// 0
// [j >>] undefined

x(1);
// 1
// [j >>] 1

x(1,2);
// 2
// [j >>] 3

 

關於arguments.callee():

下面的官方語言:
警告:嚴格模式下,第5版 ECMAScript (ES5) 禁止使用 arguments.callee()。當一個函數必須調用自身的時候, 避免使用 arguments.callee(), 經過要麼給函數表達式一個名字,要麼使用一個函數聲明.

很少寫,有興趣的能夠去這看看

arguments.callee

若是須要調用自身可使用函數表達式(下面是官方的例子):

[1,2,3,4,5].map(function factorial (n) {
    return !(n > 1) ? 1 : factorial(n-1)*n;
});
  • 該函數能夠像代碼內部的任何其餘函數同樣被調用
  • 它不會在外部做用域中建立一個變量 (除了 IE 8 及如下)
  • 它具備比訪問arguments對象更好的性能

總之,官方都廢棄了,你還執着啥?

相關文章
相關標籤/搜索