阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      JS function

      功能

      函数声明定义一个具有指定参数的函数。

      你还可以使用 Function 构造函数和 一个 function expression 定义函数。

      语法

      function name([param,[, param,[..., param]]]) {
         [statements]
      }
      

      name

      函数名

      param

      要传递给函数的参数的名称。不同引擎中的最大参数数量不同。

      statements

      包含函数体的语句。

      注意,这里的 function 属于 函数声明 ,后面还会介绍**函数表达式**了 ,虽然语法几乎相同,但是属于两个概念;请不要混淆

      描述

      一个被函数声明创建的函数是一个 Function 对象,具有 Function 对象的所有属性、方法和行为。

      查看 Function 以获取 function 的详细信息。

      函数也可以被表达式创建( function expression )

      函数可以被有条件来声明,这意味着,在一个 if 语句里,函数声明是可以嵌套的。

      有的浏览器会将这种有条件的声明看成是无条件的声明,无论这里的条件是 true 还是 false,浏览器都会创建函数。因此,它们不应该被使用。

      默认情况下,函数是返回 undefined 的。想要返回一个其他的值,函数必须通过一个 return 语句指定返回值。

      有条件的创建函数

      函数可以被有条件来声明,这意味着,函数声明可能出现在一个 if 语句里,但是,这种声明方式在不同的浏览器里可能有不同的效果。

      因此,不应该在生成环境代码中使用这种声明方式,应该使用函数表达式来代替。

      var hoisted = "foo" in this;
      console.log(`'foo' name ${hoisted ? "is" : "is not"} hoisted. typeof foo is ${typeof foo}`);
      if (false) {
        function foo(){ return 1; }
      }
      
      // 在Chrome里:
      // 'foo' 变量名被提升,但是 typeof foo 为 undefined
      //
      // 在Firefox里:
      // 'foo' 变量名被提升. 但是 typeof foo 为 undefined
      //
      // 在Edge里:
      // 'foo' 变量名未被提升. 而且 typeof foo 为 undefined
      //
      // 在Safari里:
      // 'foo' 变量名被提升. 而且 typeof foo 为 function
      

      注意,即使把上面代码中的 if(false) 改为 if(true),结果也是一样的

      var hoisted = "foo" in this;
      console.log(`'foo' name ${hoisted ? "is" : "is not"} hoisted. typeof foo is ${typeof foo}`);
      if (true) {
        function foo(){ return 1; }
      }
      
      // 在Chrome里:
      // 'foo' 变量名被提升,但是 typeof foo 为 undefined
      //
      // 在Firefox里:
      // 'foo' 变量名被提升. 但是 typeof foo 为 undefined
      //
      // 在Edge里:
      // 'foo' 变量名未被提升. 而且 typeof foo 为 undefined
      //
      // 在Safari里:
      // 'foo' 变量名被提升. 而且 typeof foo 为 function
      

      函数声明提升

      JavaScript 中的函数声明被提升到了函数定义。你可以在函数声明之前使用该函数:

      hoisted(); // "foo"
      
      function hoisted() {
           console.log("foo");
      }
      
      
      /* equal to*/
      var hoisted;
      
      hoisted = function() {
        console.log("foo");
      }
      hoisted();
      // "foo"
      

      注意 : 函数表达式 function expressions 不会被提升:

      notHoisted(); // TypeError: notHoisted is not a function
      
      var notHoisted = function() {
         console.log("bar");
      };
      

      示例

      使用函数

      下面的代码声明了一个函数,该函数返回了销售的总金额,参数是产品 a,b,c 分别的销售的数量。

      function calc_sales(units_a, units_b, units_c) {
         return units_a*79 + units_b * 129 + units_c * 699;
      }
      

      规范

      SpecificationStatusComment
      ECMAScript 1st Edition.StandardInitial definition. Implemented in JavaScript 1.0
      ECMAScript 5.1 (ECMA-262)
      Function definition
      Standard
      ECMAScript 2015 (6th Edition, ECMA-262)
      Function definitions
      Standard
      目录
      目录