js函数传参实质

ECMAScript函数的参数与大多数其他语言中函数的参数有所不同。ECMAScript函数不介意传递进 来多少个参数,也不在乎传进来参数是什么数据类型。也就是说,即便你定义的函数只接收两个参数, 在调用这个函数时也未必一定要传递两个参数。可以传递一个、三个甚至不传递参数,而解析器永远不 会有什么怨言。之所以会这样,原因是 ECMAScript 中的参数在内部是用一个数组来表示的。函数接收 到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。如果这个数组中不包含任 何元素,无所谓;如果包含多个元素,也没有问题。实际上,在函数体内可以通过 arguments 对象来 访问这个参数数组,从而获取传递给函数的每一个参数。

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

function sayHi() {
alert("Hello " + arguments[0] + "," + arguments[1]);  //hello ma ,we
}
sayHi('ma','we')
 
也可以通过length属性来控制
function howManyArgs() {
    alert(arguments.length);

}

howManyArgs("string", 45);  //2
howManyArgs();              //0
howManyArgs(12);            //1

执行以上代码会依次出现 3 个警告框,分别显示 2、0 和 1。由此可见,开发人员可以利用这一点让 5 函数能够接收任意个参数并分别实现适当的功能。请看下面的例子:

 
           
function doAdd() {
    if(arguments.length == 1) {
    alert(arguments[0] + 10);
} else if (arguments.length == 2) {
    alert(arguments[0] + arguments[1]);
}
doAdd(10);         //20
doAdd(30, 20);     //50

每次执行这个 doAdd()函数都会重写第二个参数,将第二个参数的值修改为 10。因为 arguments 对象中的值会自动反映到对应的命名参数,所以修改 arguments[1],也就修改了 num2,结果它们的 值都会变成 10。不过,这并不是说读取这两个值会访问相同的内存空间;它们的内存空间是独立的,但 它们的值会同步。另外还要记住,如果只传入了一个参数,那么为 arguments[1]设置的值不会反应到 命名参数中。这是因为 arguments 对象的长度是由传入的参数个数决定的,不是由定义函数时的命名 参数的个数决定的。

关于参数还要记住最后一点:没有传递值的命名参数将自动被赋予 undefined 值。这就跟定义了 变量但又没有初始化一样。例如,如果只给 doAdd()函数传递了一个参数,则 num2 中就会保存 undefined 值。

严格模式对如何使用 arguments 对象做出了一些限制。首先,像前面例子中那样的赋值会变得无 效。也就是说,即使把 arguments[1]设置为 10,num2 的值仍然还是 undefined。其次,重写 arguments 的值会导致语法错误(代码将不会执行)。

function doAdd(num1, num2) {
arguments[1] = 10;
alert(arguments[0] + num2); //NaN
}
doAdd(2)
 
function doAdd(num1, num2) {
arguments[1] = 10;
alert(arguments[0] + num2); //12
}
doAdd(2,4)
 

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

总结一下“

  •   ECMAScript 中的基本数据类型包括 Undefined、Null、Boolean、Number 和 String。

  •   与其他语言不同,ECMScript 没有为整数和浮点数值分别定义不同的数据类型,Number 类型可

    用于表示所有数值。

  •   ECMAScript 中也有一种复杂的数据类型,即 Object 类型,该类型是这门语言中所有对象的基

    础类型。

  •   严格模式为这门语言中容易出错的地方施加了限制。

  •   ECMAScript 提供了很多与 C 及其他类 C 语言中相同的基本操作符,包括算术操作符、布尔操作

       符、关系操作符、相等操作符及赋值操作符等。
    
  •   ECMAScript 从其他语言中借鉴了很多流控制语句,例如 if 语句、for 语句和 switch 语句等。 ECMAScript 中的函数与其他语言中的函数有诸多不同之处。

    •   无须指定函数的返回值,因为任何 ECMAScript 函数都可以在任何时候返回任何值。

    •   实际上,未指定返回值的函数返回的是一个特殊的 undefined 值。

    •   ECMAScript 中也没有函数签名的概念,因为其函数参数是以一个包含零或多个值的数组的形式传递的。

      •   可以向 ECMAScript 函数传递任意数量的参数,并且可以通过 arguments 对象来访问这些参数。

      •   由于不存在函数签名的特性,ECMAScript 函数不能重载。

 
             

猜你喜欢

转载自www.cnblogs.com/mawn/p/9202753.html