JS 关于 bind ,call,apply 和arguments p8

关于这3个货,网上有很多文章介绍,我这边还是记录下并加上自己的理解,还有arguments函数内置对象顺便也记录下:

 

简单的说apply和call 会绑定第一个参数的作用域给调用函数对象实例,并会执行调用函数,还可以传参数

apply 第二个参数是数组,call 是可变长度参数

apply、call:

例子来个:

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

是不是一下就明白了。

 

bind:

bind同样会绑定,也会穿参数,但是不会立即执行

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

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

 

arguments:

类似数组,但不是真的数组,好吧,就把它当成数组吧,它同样拥有length 而且也可以通过下标访问:

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对象更好的性能

总之,官方都废弃了,你还执着啥?

 

posted @ 2019-01-30 14:45  李鹏飞ONLINE  阅读(368)  评论(0编辑  收藏  举报