JavaScript学习:函数

    xiaoxiao2022-07-12  153

    函数

    定义(what)

      函数对任何语言来说都是一个核心的概念。函数使用 function 关键字来声明,后跟一组参数以及函数体

    function functionName(arg0, arg1,...,argN) { statements } //以下是一个函数示例: function sayHi(name, message) { console.log("Hello " + name + "," + message); } 场景(where and why)

       通过函数可以封装任意多条语句,而且可以在任何地方、 任何时候调用执行。

    怎么用(how)

         函数可以通过其函数名来调用,后面还要加上一对圆括号和参数(圆括号中的参数如果有多个, 可以用逗号隔开)。

         函数在定义时不必指定是否返回值。实际上,任何函数在任何时候都可以通过 return 语句后跟要返回的值来实现返回值。

        未指定返回值的函数返回的是一个特殊的 undefined 值。

    function sum(num1, num2) { return num1 + num2; } var result = sum(5, 10); 理解参数

            ECMAScript 函数的参数与大多数其他语言中函数的参数有所不同。ECMAScript 函数不介意传递进 来多少个参数,也不在乎传进来参数是什么数据类型。也就是说,即便你定义的函数只接收两个参数, 在调用这个函数时也未必一定要传递两个参数。可以传递一个、三个甚至不传递参数,而解析器永远不 会有什么怨言。

           之所以会这样,原因是 ECMAScript 中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。如果这个数组中不包含任 何元素也无所谓;如果包含多个元素,也没有问题。实际上,在函数体内可以通过 arguments 对象来访问这个参数数组,从而获取传递给函数的每一个参数。

          其实,arguments 对象只是与数组类似(它并不是 Array 的实例),因为可以使用方括号语法访 问它的每一个元素(即第一个元素是 arguments[0],第二个元素是 argumetns[1],以此类推),使 用 length 属性来确定传递进来多少个参数。在前面的例子中,sayHi()函数的第一个参数的名字叫 name,而该参数的值也可以通过访问 arguments[0]来获取。

    注意:

    1、ECMAScript 中的所有参数传递的都是,不可能通过引用传递参数。

        也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。基本类型值的传递如同基本类型变量的复制一样,而引用类型值的传递,则如同引用类型变量的复制一样。有不少开发人员在这一点上可能会感到困惑,因为访问变量有按值和按引用两种方式,而参数只能按值传递。

           在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,或者用 ECMAScript 的概念来说,就是 arguments 对象中的一个元素)。在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。

    2、命名的参数只提供便利,但不是必需的。另外,在命名参数方面,其他语言可能需要事先创建一个函数签名,而将来的调用必须与该签名一致。但 在 ECMAScript 中,没有这些条条框框,解析器不会验证命名参数。

    3、arguments 对象可以与命名参数一起使用。

    4、arguments 的值永远与对应命名参数的值保持同步。

    5、没有传递值的命名参数将自动被赋予 undefined 值。这就跟定义了 变量但又没有初始化一样。

    6、严格模式对如何使用 arguments 对象做出了一些限制。赋值会变得无效,其次,重写 arguments 的值会导致语法错误(代码将不会执行)。

    没有重载

             函数不能像传统意义上那样实现重载。而在其他语言(如 Java)中,可以为一个函数 编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可。如前所述,ECMAScirpt 函数没有签名,因为其参数是由包含零或多个值的数组来表示的。而没有函数签名,真正的重载是不可能做到的。 如果在 ECMAScript 中定义了两个名字相同的函数,则该名字只属于后定义的函数。

          通过检查传入函数中参数的类型和数量并作出不同的反应,可以模仿方法的重载。

     

    最新回复(0)