關於這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(),
經過要麼
給函數表達式一個名字,要麼使用一個函數聲明.
很少寫,有興趣的能夠去這看看
若是須要調用自身可使用函數表達式(下面是官方的例子):
[1,2,3,4,5].map(function factorial (n) { return !(n > 1) ? 1 : factorial(n-1)*n; });
總之,官方都廢棄了,你還執着啥?