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/