zoukankan      html  css  js  c++  java
  • 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对象更好的性能

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

    成灰之前,抓紧时间做点事!!
  • 相关阅读:
    iOS小技巧总结,绝对有你想要的
    Myeclipse for Mac快捷键
    iOS开发如何学习前端
    iOS应用支持IPV6,就那点事儿
    App Store审核被拒的23个理由
    43个优秀的Swift开源项目
    ExtJs组件之间的相互访问,访问机制
    hibernate or连接查询内容/criteria动态或连接查询/disjunction/其他查询条件
    hibernate如何解除关系———只删除多方保留一方
    java如何操作视图
  • 原文地址:https://www.cnblogs.com/jony-it/p/10338047.html
Copyright © 2011-2022 走看看