blogSite

我是谁?我在哪儿?我在干什么?

View project on GitHub

JavaScript 函数

JavaScript 函数定义

JavaScript 函数是通过 function 关键词定义的。 您可以使用函数声明或函数表达式

  • 函数声明 被声明的函数不会直接执行。它们被“保存供稍后使用”,将在稍后执行,当它们被调用时。
      function functionName(parameters) {
      要执行的代码
      }
      // 实例
      function myFunction(a, b) {
          return a * b;
      }
    
  • 函数表达式 JavaScript 函数也可以使用表达式来定义。
      // 函数表达式可以在变量中存储:
      var x = function (a, b) {return a * b};
      // 结果:function (a, b) {return a * b} 
      // 在变量中保存函数表达式之后,此变量可用作函数:
      var x = function (a, b) {return a * b};
      var z = x(4, 3);
      // 结果:12
    

    上面的函数实际上是一个匿名函数(没有名称的函数)。 存放在变量中的函数不需要函数名。他们总是使用变量名调用。 上面的函数使用分号结尾,因为它是可执行语句的一部分。

  • Function() 构造器 大多数情况下,您可以避免在 JavaScript 中使用 new 关键词。
  • 函数提升 “提升”(hoisting) Hoisting 是 JavaScript 将声明移动到当前作用域顶端的默认行为。 Hoisting 应用于变量声明和函数声明。 正因如此,JavaScript 函数能够在声明之前被调用:
    myFunction(5);

    function myFunction(y) {
        return y * y;
    }

使用表达式定义的函数不会被提升。

  • 自调用函数(不被调用的情况下自己开始,只运行一次) 函数表达式可以作为“自调用”。 自调用表达式是自动被调用(开始)的,在不进行调用的情况下。 函数表达式会自动执行,假如表达式后面跟着 ()。 您无法对函数声明进行自调用。 您需要在函数周围添加括号,以指示它是一个函数表达式:
    (function () {
        var x = "Hello!!";      //我会调用我自己
    })();

上面的函数实际上是一个匿名的自调用函数(没有名称的函数)。

  • 函数可用作值 JavaScript 函数可被用作值:
    function myFunction(a, b) {
        return a * b;
    }

    var x = myFunction(4, 3);

JavaScript 函数可用在表达式中:

    function myFunction(a, b) {
        return a * b;
    }

    var x = myFunction(4, 3) * 2;
  • 函数是对象 JavaScript 中的 typeof 运算符会为函数返回 “function“。 但是最好是把 JavaScript 函数描述为对象。 JavaScript 函数都有属性和方法。 arguments.length 会返回函数被调用时收到的参数数目:
      function myFunction(a, b) {
          return arguments.length;
      }
    

    toString() 方法以字符串返回函数:

      function myFunction(a, b) {
          return a * b;
      }
    
      var txt = myFunction.toString();
    
  • 箭头函数 箭头函数允许使用简短的语法来编写函数表达式。 您不需要 function 关键字、return 关键字和花括号。
      // ES5
      var x = function(x, y) {
      return x * y;
      }
    
      // ES6
      const x = (x, y) => x * y;
      const x = (x, y) => { return x * y }; // 推荐,保留好习惯
    

    IE11 或更早的版本不支持箭头函数。

    JavaScript 函数参数

  • 参数默认 如果调用参数时省略了参数(少于被声明的数量),则丢失的值被设置为:undefined
  • arguments 对象 JavaScript 函数有一个名为 arguments 对象的内置对象。 arguments 对象包含函数调用时使用的参数数组。
  • 参数通过值传递 函数调用中的参数(parameter)是函数的参数(argument)。 JavaScript 参数通过值传递:函数只知道值,而不是参数的位置。 如果函数改变了参数的值,它不会改变参数的原始值。 参数的改变在函数之外是不可见的。
  • 对象是由引用传递的 在 JavaScript 中,对象引用是值。 正因如此,对象的行为就像它们通过引用来传递: 如果函数改变了对象属性,它也改变了原始值。 对象属性的改变在函数之外是可见的。

    JavaScript 闭包

  • JavaScript 闭包 记得自调用函数吗?这种函数会做什么呢?
      var add = (function () {
          var counter = 0;
          return function () {return counter += 1;}
      })();
    
      add();
      add();
      add();
    
      // 计数器目前是 3 
    

    变量 add 的赋值是自调用函数的返回值。 这个自调用函数只运行一次。它设置计数器为零(0),并返回函数表达式。 这样 add 成为了函数。最“精彩的”部分是它能够访问父作用域中的计数器。 这被称为 JavaScript 闭包。它使函数拥有“私有”变量成为可能。 计数器被这个匿名函数的作用域保护,并且只能使用 add 函数来修改。 闭包指的是有权访问父作用域的函数,即使在父函数关闭之后。

参考内容

首页 > 学习总览 > 开发语言 > JavaScript