javascript:传递给函数的隐含参数:arguments
众所周知,js是脚本语言,脚本语言的一个特点就是极其灵活。有时“灵活”到使我这种习惯c系主流语言的人不得不佩服脚本的强大。比如这里要讲到的arguments参数。本人第一次看到这个东东的时候,以为就是“变相”的普通参数,只不过不用在定义函数的时候明确声明而已。
不过,代码是廉价的(Code is cheap.)看代码:
function funcTest(a, b) {
alert(a);
alert(b);
for (var i = 0; i < arguments.length; i++) {
alert(arguments[i]);
}
}
function test() {
funcTest(1, 2, 3); // 放到html页进行执行
}
代码运行后怎么样,不错,这里的length实在是很奇怪,对不对?我们来看书中是怎么说的,“代码运行时会依次显示:1,2,1,2,3。因此,在定义函数的时候,即使不指定参数列表,仍然可以通过arguments引用到所获得的参数,这给编程带来了很大的灵活性”。没有比这句更加精辟的阐释了。
看到这里,我们可能都有一个疑问(如果你稍微具备一点js编程知识的话),arguments参数是不是js数组对象的一个实例?下面的代码会帮你解决这个疑点:
Array.prototype.testArg = "test arguments";
function funcArg() {
alert(arguments.testArg);
}
function test() {
alert(new Array().testArg);
funcArg();
}
代码运行结果是先弹出"test arguments"和"undefined",为什么funcArg调用返回“undefined”?看到这里相信你对上面的疑问已经消除。
到这里你以为你掌握了arguments的全部?那就太小瞧js的天才设计者(们)了,下面看另外一个有才的设计:
Q:使用递归来计算1 到n 的自然数之和
A1:
function sum(n) {
if (1 == n) return 1;
else return n + sum(n - 1);
}
function test() {
alert(sum(100)); ; // 放到html页进行执行
}
A2:
function sum(n) {
if (1 == n) return 1;
else return n + arguments.callee(n - 1);
}
function test() {
alert(sum(100)); ; // 放到html页进行执行
}
A1和A2这两个回答都解决了问题,相信第一种方法是大多数人的常规做法,但是js推荐使用第二种,原书说A1这种方式“其中函数内部包含了对sum 自身的调用,然而对于JavaScript 来说,函数名仅仅是一个变量名,在函数内部调用sum 即相当于调用一个全局变量,不能很好的体现出是调用自身”,sum都调用sum了,还说“不能很好的体现出是调用自身”,为什么呢?
书到用时方恨少,查书,书上是这么写的:“arguments 对象的另一个属性是callee,它表示对函数对象本身的引用,这有利于实现无名函数的递归或者保证函数的封装性,”这话我承认说的有理,我从来都对书本尤其是技术类的书本保持高度的信任,可是这里说“arguments 对象的另一个属性是callee”,这里“arguments ”怎么成“对象”了?标题都说“传递给函数的隐含参数:arguments ”,难道抄书抄错了?查看电子书,靠,复制粘贴还会有错?
分享到:
相关推荐
`arguments`对象是JavaScript函数被调用时,传递给函数的所有参数的集合。这个集合既不是Array的实例,也不是Object的实例,但它表现得像一个类数组对象(array-like object),提供了一种访问函数参数的方式,无需...
总结,`arguments`, `caller`, 和 `callee`是JavaScript函数中三个重要的隐含参数,它们提供了一种动态访问和操作函数调用参数的方式,以及跟踪函数调用链的能力。然而,由于`arguments.callee`在ES5后的限制,现在...
#### Arguments对象:JavaScript函数调用的参数管理器 在JavaScript中,每个函数都有一个隐含参数`arguments`,它允许开发者访问传递给函数的所有参数,无论在函数定义时是否明确指定了这些参数。`arguments`对象是...
在提到上述的概念之前,首先想说说javascript中函数的隐含参数: arguments arguments 该对象代表正在执行的函数和调用它的函数的参数。[function.]arguments[n]参数function:选项。当前正在执行的 Function 对象的...
在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments 该对象代表正在执行的函数和调用它的函数的参数。 [function.]arguments[n] 参数function :选项。当前正在执行的 Function 对象...
- arguments对象在每个函数内部可用,它包含了函数调用时实际传递的所有参数,arguments.length表示实际参数的个数。 7. **函数的length属性**: - 每个函数对象都有一个length属性,表示函数期望接收的参数个数...
6. **隐含对象arguments**:在每个函数内部,都有一个arguments对象,它包含了函数调用时传入的所有参数,即使没有在函数声明中定义这些参数。arguments.length表示实际传入参数的个数。 7. **函数的length属性**:...
- **arguments对象**:函数体内部有一个隐含的arguments对象,可获取所有传入参数,其length属性表示参数数量,callee属性指向函数自身。 - **构造函数**:构造函数通过`new`关键字调用,用于初始化对象,使用`...
arguments对象的一个有用属性是`arguments.length`,它表示传递给函数的参数个数。通过遍历arguments对象,我们可以访问到所有实际传递给函数的参数。即便函数的参数列表声明了一个特定的参数个数,函数仍然可以接受...
每个函数都有两个隐含参数:`this`和`arguments`。`this`关键字在JavaScript中并不像其他面向对象语言那样始终指向类对象的当前实例,而是根据函数的调用方式来确定其值。在函数调用中,`this`引用的是调用函数的上...
这个隐含参数有助于函数能够访问所有传递给它的参数,即使没有明确地在函数定义中声明它们。这一点在处理不定数量的参数时特别有用。 总之,该学习笔记涵盖了JavaScript基础知识点,包括对象和类的创建、原型对象的...
`arguments`对象是函数调用时隐含传入的,它包含了所有传入函数的实际参数,并且可以通过索引来访问,还可以获取参数的长度,其中`arguments.callee`属性指向当前执行的函数。 2. **Date对象**: - Date对象在...
在严格模式中,`arguments`对象不再动态地反映函数参数的变化。这意味着,即使在函数内部修改了参数,`arguments`对象的对应值也不会改变。而在非严格模式中,`arguments`与函数参数之间存在双向绑定。 5. **eval...