arguments详解
arguments 是什么?
是一个对象,一个 很像数组的对象
arguments内容是什么?
1是函数运行时的实参列表
2收到实参收集起来,放到一个arguments对象里
在词法分析中,首先按形参形成AO的属性,值为undefined
当实参传来时,再修改AO的相应属性
t(a,b,c){};
调用时:t(1,2,3,4,5)个参数,
此时AO属性有a,b,c三个属性,arguments里有1,2,3,4,5所有的值
对于超出形参个数之外的实参,可以通过arguments来获得
3arguments的索引从0,1,2递增,与实参对应
4arguments.length属性代表实参的个数
5arguments一定不是数组,是长得比较像数组的一个对象,虽然也有length属性
6arguments每个函数都会有,因此,arguments只会在内部找自身的arguments,无法引用外部的arguments
(function(d,e,f){
//在此函数内,无法用d,e,f形参来取得“haha”,因为没有与之相应的形参
//但我们可以用arguments来获取任意多个的实参
console.log(arguments[3]);
})("Hello","world","?","haha");
(function(d,e,f){
alert(typeof arguments);
})("Hello","world","?"); //object
callee与caller
caller返回一个函数的引用,这个函数调用了当前的函数;callee放回正在执行的函数本身的引用,它是arguments的一个属性
caller
caller返回一个函数的引用,这个函数调用了当前的函数。
使用这个属性要注意:
1 这个属性只有当函数在执行时才有用
2 如果在javascript程序中,函数是由顶层调用的,则返回null
functionName.caller: functionName是当前正在执行的函数。
- var a = function() {
- alert(a.caller);
- }
- var b = function() {
- a();
- }
- b();
上面的代码中,b调用了a,那么a.caller返回的是b的引用,结果如下:
- var b = function() {
- a();
- }
如果直接调用a(即a在任何函数中被调用,也就是顶层调用),返回null:
- var a = function() {
- alert(a.caller);
- }
- var b = function() {
- a();
- }
- //b();
- a();
输出结果:
null
callee
callee放回正在执行的函数本身的引用,它是arguments的一个属性
使用callee时要注意:
1 这个属性只有在函数执行时才有效
2 它有一个length属性,可以用来获得形参的个数,因此可以用来比较形参和实参个数是否一致,即比较arguments.length是否等于arguments.callee.length
3 它可以用来递归匿名函数。
- var a = function() {
- alert(arguments.callee);
- }
- var b = function() {
- a();
- }
- b();
a在b中被调用,但是它返回了a本身的引用,结果如下:
- var a = function() {
- alert(arguments.callee);
- }