关于Arguments对象 About Argument object
最近读书心得,有错误欢迎指正:)
在javascript中,arguments是一个函数对象,表示正在执行的函数和调用他的参数。Arguments有点象数组,但是它不是一个真的数组。所以,他具有length属性,可以代表传递给函数的参数的个数。
这是1.5参考:
The arguments object is a local variable available within all functions; arguments as a property of Function can no longer be used. You can refer to a function's arguments within the function by using the arguments object. This object contains an entry for each argument passed to the function, the first entry's index starting at 0.
例如:
function sayHi() { alert(arguments.lenght); // 0 }
按照上面所说的,Arguments类似数组,所以我们可以象使用数组一样使用它。
例如:
function sayHi(num1,num2) { return arguments[0] + arguments[1]; //如果你理解数组的话,我们知道arguments[0]代表第一个参数,[1]代表第二个参数; }
简单来说,argunments表示函数正在传递的参数的集合,但是他是一个特殊的对象,类似数组却不是一个数组。
象上面的例子,其实这样写
function sayHi(num1,num2) { return num1 + num2; }
是完全一样的意思的。
通过arguments对象可以获知多少个参数传递给了函数,开发人员可以利用这一点让函数能够接受任意个参数并且实现适当的功能。
例如:
function sayHi() { if(arguments.lenght == 1){ return argunments[0] + 10; } else if(arguments.lenght == 2) { return argunments[0] + argunments[1]; } } sayHi(1); // 11; sayHi(2,3); // 5;
通过这个函数,我们可以给函数传递1个或者2个参数,根据条件函数会返回2个不同的值。
而且,arguments对象可以和命名参数一起使用。
上面的函数可以写成:
function sayHi(num1,num2) { if(arguments.lenght == 1){ return argunments[0] + 10; } else if(arguments.lenght == 2) { return argunments[0] + num2; } } sayHi(1); // 11; sayHi(2,3); // 5;
js不会主动为你判断你到底给函数传了多少个参数,如果你多传了,多余的部分就没有被使用,如果你少传了,那么没传的参数值就是undefined
上面的例子,如果你只传递了1个参数num1,那么num2就会保存undefined值。
现在,我们拿Chris的那道题来作例子。
Implement a recursion function that accept two number parameters,
"start" and "end".
Then add up all the numbers between "start" and "end".
Can not invoke functions inside itself, all functions that used in
calculation should be anonymous.
For example:
var abc = function(){ // can not invoke "abc" var result = (function(){})(); }===== Chinese Version =====
实现一个匿名函数, 接受两个数字参数, "start" 和 "end", 把 "start" 到 "end" 之间的数 (包括自身) 相加.
不允许在函数内部调用自己, 参与运算的函数均为匿名函数:
var abc = function(){ // 不能直接调用 "abc" var result = (function(){})(); }
var sum = function(){ //建立一个匿名函数; var args = arguments; if(args.length !== 2){ return !1; //判断参数的length } var min = parseInt(args[0], 10), max = parseInt(args[1], 10); //赋值min,max,将第一个第二个参数转换为十进制,如果不是数 值将会返回NaN if(!isNaN(min) && !isNaN(max)){ if(min === max){ return min; } if(min > max){ max = [min, min = max][0]; //判断min,max大小,如果min大于max,交换min与max的值; } return min + args.callee.call(null, ++min, max); //循环,每次自身+1,并返回自身,直到max为止 } return !isNaN(min) ? min : max; };
关于
var min = parseInt(args[0], 10), max = parseInt(args[1], 10);
parseInt是将一个字符串转换成数值而如果
If the first character cannot be converted to a number, parseInt returns NaN.
For arithmetic purposes, the NaN value is not a number in any radix. You can call the isNaN function to determine if the result of parseInt is NaN. If NaN is passed on to arithmetic operations, the operation results will also be NaN.
这里主要是为了防止传进类似010这样的参数导致变成8进制
关于callee
callee是argument对象的一个属性,常用于匿名函数,它用来在函数内部引用函数本身,这个方法非常有用,特别是你不知道函数名称的时候。
文档中的描述:
callee is a property of the arguments object. It can be used to refer to the currently executing function inside the function body of that function. This is for example useful when you don't know the name of this function, which is for example the case with anonymous functions.
下面是用callee来实现一个阶乘的函数:
function create() { return function(n) { if (n <= 1) return 1; return n * arguments.callee(n - 1); }; } var result = create()(5); // returns 120 (5 * 4 * 3 * 2 * 1)
在这个函数中,在n<=1之前,参数都会被自身重复调用一次,当符合条件时,即最后n小于1只返回1执行。