arguments是函数内部自带的对象,它是一个类数组的存在,所谓的类数组就是没有数组的方法,
但可以通过下标来访问内部的元素,也有length属性。它的作用呢?
保存了函数调用的时候传入的实际的参数,通过length属性可知道传入参数的数量。
比如例子中的函数fn
function fn(arg1,arg2,arg3,arg4) { //此时arguments.length不是4,因为它不是由声明函数时的形参数量决定的 //而是由调用fn时传入的参数的数量决定的 } fn(1,2,3); arguments.length是3 fn(1); arguments.length是1
于是得知:length的值是由调用函数传递的参数决定的而不是由声明函数时的形参的个数决定的.
一些想法:arguments是一个对象,对象是一个不固定的存在,也就是活的东西,你可以这样理解。
相反的比如数字2,它是固定的存在,所占的内存大小是固定的,不可以变的。对象显然不是
那么调用函数时传入的参数不与声明函数时参数的数量保持一致也就可以理解啦。
调用时无论传入的函数的参数个数是多少,形参不会有任何的怨言,函数也不会发脾气报错啥的,因为最终都会保存在arguments对象中。形参好像就只是一支"花瓶"!
接着:非严格模式下,没有在script标签内使用"use strict";
通过arguments可以修改传入的形参的值,当然有一个共同的前提条件,形参必须存在,而且值不为特殊的值undefined
eg:
function fn1(arg1,arg2,arg3) { //arg1值存在 console.log(arg1); //1 arguments[0] = 20; console.log(arg1); //20 //arg3值特殊值undefined,因为函数调用时没有传入,那么这样的修改是无效的 console.log(arg3); //undefined arguments[2] = 100; console.log(arg3); //undefined //依然是undefined,修改无效 } fn1(1,2);
相反的:通过形参也可以修改对应的arguments的值。前提也是arguments的值不是特殊值undefined
function fn2(arg1,arg2,arg3) { //arguments[0]值存在,通过修改arg1的值,arguments[0]的值也得到修改 console.log(arguments[0]); //1 arg1 = 20; console.log(arguments[0]); //20 //arguments[3]值是特殊值undefined,函数调用时没有传入,修改arg3的值,arguments[3]的值是不会得到修改的的 console.log(arguments[2]); //undefined arg3 = 100; console.log(arguments[2]); //undefined //依然是undefined,修改无效 } fn2(1,2);
接着:如果在严格模式下,上述的两种修改不生效的。严格模式下,形参的值是与arguments的值是独立的,没有任何的关系。"你走人的独木桥,我走我的阳关道"!
(Javascript高级程序设计第3版PDF的说法好像是错误的。)
引申:既然arguments是函数内部的一个参数对象的,那么除了在非严格模式下修改对应的形参的值
还有没有其他的作用呢?
有:模拟函数的重载。因为函数是没有重载的。同名函数后面的函数会覆盖前面的函数(可以脑补下)。
重载:通过传入调用时参数的个数不同在同一个函数中实现不同的功能
eg: 模拟函数的重载,参数个数是1的时候打印1。其他的情况打印2
function fn3(arg1,arg2) { if (arguments.length == 1) { console.log(1); } else { console.log(2); } }