1.每个函数里面都隐式存在这arguments,也就是我们常用的实参列表,这也是我们能在函数体中调用其的原因。同时只有函数被调用时,arguments对象才会创建,未调用时其值为null。
function sum(){ // arguments [1,2,3] var result =0; for(var i = 0;i < arguments.length;i++{ result += arguments[i]; } console.log(result); } sum(1,2,3);
2.当我们在控制台中输出arguments时我们会发现arguments并不是一个数组,而是一个类数组对象。
3.当你在函数体中对形参进行赋值你会发现arguments也会发生改变,说明二者存在映射关系。
function sum(a,b,c){ //arguments [1,2,3] //var a = 1; //var b = 2; //var c = 3; a=2; var result =0; console.log(arguments[0]) for(var i=0; i<arguments.length;i++){ result+=arguments[i]; } console.log(result); } sum(1,2,3) /* 2 7 */
4.arguments.callee的作用 讲这个之前我想先讲一下caller,同时讲下arguments.caller
函数的caller,在一个函数调用另一个函数时,被调用函数隐式的产生一个caller属性,存放着调用它的函数对象。
function oCall() { console.log(oCall.caller); } function oCaller() { oCall(); } oCaller();
arguments.caller感觉上没什么用,但在严格模式下不可使用且会报错。
arguments.callee同样在严格模式下不可使用,指向拥有该arguments的函数对象,也就是下面例子中的oCall,在特定情况下我们不想使用oCall的函数名时可以用arguments.callee属性来代替。例:在setTimeOut 中调用
function oCall(a) { console.log(arguments.callee); } function oCallee(a) { oCall(); }
5.arguments和parameters的区别和用法,以及在es6中的使用差别可以去下面的链接查看,以后有空我也会补上
https://www.smashingmagazine.com/2016/07/how-to-use-arguments-and-parameters-in-ecmascript-6/