美文网首页
JavaScript:函数学习

JavaScript:函数学习

作者: 勇往直前888 | 来源:发表于2017-03-20 17:24 被阅读16次

    函数声明

    • function关键字,函数名称,函数定义
    • 可以先使用,再定义,有提升功能
    • 没有重载,定义相同函数名、不同参数签名的函数,后面的函数会覆盖前面的函数。调用时,只会调用后面的函数。
    • 这是最传统的使用方式,推荐使用
    • 函数定义的{}后面不要有;这仅仅是定义,不是执行;执行语句的()后面可以有;=== 区分定义和使用
    console.log(square(5));
    /* ... */
    function square(n) {
        return n*n;
    } // 这里不要有;只是定义,不是执行
    

    函数表达式

    • 函数可以用表达式的方法赋值给一个变量
    • 可以省略函数名,以后用变量名调用
    • 表达式{}后面要有;
    • 需要先定义再使用,没有提升功能
    var square = function(number) {
      return number * number
    };  // 这里有;
    var x = square(4); // x得到的值为16
    
    • 也可以提供函数名,并且可以用于在函数内部代指其本身,或者在调试器堆栈跟踪中识别该函数,可以用在递归调用中,比较方便
    var factorial = function fac(n) {return n<2 ? 1 : n*fac(n-1)};
    console.log(factorial(9));
    
    • 函数变量可以作为其他函数的参数,这种方式推荐使用,比如模拟map的实现:
    function map(f,a) {
      var result = [];// 创建一个新的数组
    
      for (var i = 0; i != a.length; i++) {
          result[i] = f(a[i]);
      }
      return result;
    }
    var f = function(x) {
        return x * x * x
    };
    var a = [0, 1, 2, 5, 10];
    var b = map(f, a);   // b = [0, 1, 8, 125, 1000]; a = [0, 1, 2, 5, 10];
    

    自调用函数

    • 没有函数名
    • 也不赋值给一个变量
    • 定义用()包起来,后面紧跟着(),定义后马山执行
    • 用在只执行一次的场景。
    (function () {
        var x = "Hello!!";      // 我将调用自己
        alert(x);
    })();
    

    闭包

    • 假设,函数A内部声明了个函数B,函数B引用了函数B之外的变量,并且函数A的返回值为函数B的引用。那么函数B就是闭包函数。
    • 通常用在对的gettersetter函数
    var createPet = function(name) {
      var sex;
      
      return {
        setName: function(newName) {
          name = newName;
        },
        
        getName: function() {
          return name;
        },
        
        getSex: function() {
          return sex;
        },
        
        setSex: function(newSex) {
          if(typeof newSex == "string" 
            && (newSex.toLowerCase() == "male" || newSex.toLowerCase() == "female")) {
            sex = newSex;
          }
        }
      }
    }
    
    var pet = createPet("Vivie");
    pet.getName();                  // Vivie
    
    pet.setName("Oliver");
    pet.setSex("male");
    pet.getSex();                   // male
    pet.getName();                  // Oliver
    

    使用arguments对象

    函数的实际参数会被保存在一个类似数组的arguments对象中。在函数内,可以通过arguments[i]找出传入的参数。比如,模仿数组的join函数实现:

    function myConcat(separator) {
       var result = ""; // initialize list
       // iterate through arguments
       for (var i = 1; i < arguments.length; i++) {  // 0 是separator
          result += arguments[i] + separator;
       }
       return result;
    }
    // returns "red, orange, blue, "
    myConcat(", ", "red", "orange", "blue");
    // returns "elephant; giraffe; lion; cheetah; "
    myConcat("; ", "elephant", "giraffe", "lion", "cheetah");
    // returns "sage. basil. oregano. pepper. parsley. "
    myConcat(". ", "sage", "basil", "oregano", "pepper", "parsley");
    

    参考文章

    函数

    JavaScript function函数种类

    JavaScript 函数定义

    相关文章

      网友评论

          本文标题:JavaScript:函数学习

          本文链接:https://www.haomeiwen.com/subject/rzgbnttx.html