zoukankan      html  css  js  c++  java
  • JS 函数(arguments、箭头函数、bind)

    参数

      函数内部可用的 arguments 对象来访问函数的实参

      注意

    • 在函数递归调用的时候(在某一刻同一个函数运行了多次,也就是有多套实参),那么 arguments 属性的值是最近一次该函数调用时传入的实参
    • 如果函数不在执行期间,那么该函数的 arguments 属性的值是 null
    • arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性。例如,它没有 pop 方法,但是可以使用Array.prototype.pop.call(arguments,obj)借用Array方法
    • 使用扩展运算符的方法可以讲arguments对象展开成一个真正的数组  例如:
      var args = [...arguments];
    • argument.callee 属性包含正在执行函数,这在函数的名称是未知时很有用,例如在没有名称的函数表达式 (也称为“匿名函数”)内
      //计算阶乘
      function factorial(n){
          if(n == 1){
              return 1
          }
          return n*arguments.callee(n-1);
      }
      console.log(factorial(5));

       

    bind 方法

      JavaScript新手经常犯的一个错误是将一个方法从对象中拿出来,然后再调用,希望方法中的 this 是原来的对象(比如在回调中传入这个方法)。如果不做特殊处理的话,一般会丢失原来的对象。从原来的函数和原来的对象创建一个绑定函数

    var module = {
      x: 42,
      getX: function() {
        return this.x;
      }
    }
    var unboundGetX = module.getX;
    console.log(unboundGetX()); // 这里输出的是全局环境下 x 变量
    var boundGetX = unboundGetX.bind(module); //绑定对象
    console.log(boundGetX());
    // expected output: 42

     

    箭头函数

      在箭头函数出现之前,每个新定义的函数都有它自己的 this值(在构造函数的情况下是一个新对象,在严格模式的函数调用中为 undefined,如果该函数被称为“对象方法”则为基础对象等)例如

    function Person() {
      // Person() 构造函数定义 `this`作为它自己的实例.
      this.age = 0;
    
      setInterval(function growUp() {
        // 在非严格模式, growUp()函数定义 `this`作为全局对象, 
        // 与在 Person()构造函数中定义的 `this`并不相同.
        this.age++;
      }, 1000);
    }
    
    var p = new Person();

    过去的解决办法是在 Person中新建一个变量指向this 例如 var that = this

    箭头函数的出现解决了这个问题,箭头函数不会创建属于自己的this,它使用封闭执行上下文的this值。因此,在下面的代码中,传递给setInterval的函数内的this与封闭函数中的this值相同

    function Person(){
      this.age = 0;
    
      setInterval(() => {
        this.age++; // |this| 正确地指向person 对象
      }, 1000);
    }
    
    var p = new Person();

    注意

    • 箭头函数不绑定Arguments 对象
    • 箭头函数只能用于非方法函数
    • 箭头函数不能作为构造函数
    • 箭头函数没有property属性

    最后来看一下箭头函数使用语法

    (参数1, 参数2, …, 参数N) => { 函数声明 }
    (参数1, 参数2, …, 参数N) => 表达式(单一)
    //相当于:(参数1, 参数2, …, 参数N) =>{ return 表达式; }
    // 当只有一个参数时,圆括号是可选的:
    (单一参数) => {函数声明}
    单一参数 => {函数声明}
    // 没有参数的函数应该写成一对圆括号。
    () => {函数声明}

    默认参数

      JS函数也可以在声明参数时赋默认值,如果不给默认值,JavaScript 中函数的参数默认是undefined

    function multiply(a, b = 1) {
      return a * b;
    }

    剩余参数

      剩余参数语法允许我们将一个不定数量的参数表示为一个数组

    function(a, b, ...theArgs) {
      // ...
    }

      剩余参数和 arguments对象之间的区别主要有三个:

    • 剩余参数只包含那些没有对应形参的实参,而 arguments 对象包含了传给函数的所有实参。
    • arguments对象不是一个真正的数组,而剩余参数是真正的 Array实例,也就是说你能够在它上面直接使用所有的数组方法,比如 sort,map,forEach或pop。
    • arguments对象还有一些附加的属性 (如callee属性)
  • 相关阅读:
    Java 的JDBC 数据库连接池实现方法
    在tomcat下context.xml中配置各种数据库连接池
    Eclipse大括号换行显示
    编写.reg文件 导入注册表
    servlet中使用session
    IIS7整合Tomcat6
    TOMCAT数据库连接池的配置方法总结(待续)
    windows2003下iis6.0+tomcat6.0的整合配置
    TransactSQL处理小数
    专案同时使用两种数据库
  • 原文地址:https://www.cnblogs.com/xiaoliwang/p/9043942.html
Copyright © 2011-2022 走看看