函数arguments属性解读函数传参:在函数调用的时候浏览器每次都会传递进两个隐式参数:函数上下文的this,封装实参的对象arguments
arguments属性为当前执行中函数对象返回arguments对象和参数,是所在函数的一个内置类数组对象
arguments对象不能显示的创建,只有在函数开始时才可用
arguments具有length属性,arguments.length为函数实参个数
在没有定义形参变量的情况下,传来了参数并被arguments接受 所以arguments是一个隐藏对象
function fn2(){
console.log(arguments)
console.log(arguments.length)
}
fn2();//Arguments [callee: ƒ, Symbol(Symbol.iterator): ƒ] 0
fn2(2,3); //Arguments(2) [2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ] 2
在函数中定义形参接受参数
function fn3(x){
console.log(x) // 1
console.log(arguments); // 1,2,3,hello
console.log(arguments[0]) //1
}
// 函数fn3定义了一个形参x 所以只接受第一个传过来的参数
fn3(1,2,3,'hello')
...args展开运算符接受参数
function fn(a,b,...args){
console.log(a,b,args) //1 2 [3, 4, 5, 6, 7]
}
fn(1,2,3,4,5,6,7)
arguments.callee 是一个指针,指向当前函数,这个函数没有当前的参数环境,是一个纯净的function实例,可以达到调用自身函数的效果,但是在严格模式中不适用
// 可以用arguments.callee来让匿名函数实现递归
var sum = function(n){
if (n <= 0) return 1;
else {
return n + arguments.callee(n - 1)
}
}
//比较一般的递归函数:
var sum2 = function(n){
if (1==n) return 1;
else return n + sum2 (n-1);
}
//调用时:
console.log(sum(2)); //4
console.log(sum2(2)); //3
正常模式下,arguments对象可以在运行的时候就行修改,严格模式下修改arguments对象不会影响到实际的参数
function f2(x,y){
arguments[0] = 10;
arguments[1] = 20;
return x+y
}
function f3(x,y){
'use strict'
arguments[0] = 10;
arguments[1] = 20;
return x+y
}
console.log(f2(1,1))
console.log(f3(1,1))
网友评论