本文主要是介绍最详细的JS学习笔记(连载)第二章、函数(arguments),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
函数属性arguments
(1)高阶函数
高阶函数:所谓高阶函数就是操作函数的函数,它接收一个或多个函数作为参数,并返回新函数
参数arguments 函数内置的实参集合
- 、类数组集合,集合中存着所有函数执行时,传递实参的信息。
- 、不论有没有设置形参,arguments都会存在。
- 、不论有没有传递形参,arguments都会存在
当函数被调用时,会得到一个免费奉送的参数数组,那就是arguments数组。通过它,函数可以访问所有它被调用时传递给他的参数列表。这使得编写一个无需指定参数个数的函数成为可能。
var sum = function(){
var i ,sum =0;
for(i = 0;i<arguments.length;i+=1){
sum+=arguments[i];
}
return sum;
};
document.writeln(sum(4,5,23,13,35,46,-10));//116
在ECMAScript中的参数在内部是用一个数组来表示的,函数接收到的始终都是这个数组,而不关心数组中包含哪些参数
function add(num1,num2){
num = num1 + num2;
return num;
}
var result = 12,count = 20;
alert(add(result,count)); //32;命名的参数只提供便利,解析器不会验证命名参数
实际上,arguments并不是一个真正的数组,它只是一个类数组的对象,它拥有一个length属性,但他缺少所有数组的方法。另外,arguments对象的长度是由传入的参数个数决定的,而不是由定义函数时的命名参数的个数决定的
函数在定义或者声明的时候,所有的参数都是形参,因此,我们可以根据实际情况来命名参数,函数也只有在被调用时才会传入实参。而每个函数在被调用时都会自动取得两个特殊变量:this 和 arguments
(2) arguments
1)作用
1.在js中函数定义没有任何参数,调用该函数时可以传递任意参数!
2.arguments对象是类数组对象。
3.arguments对象的length属性:获取函数的实参个数!
4.利用arguments对象特性,实现模拟函数的重载的效果.
找出数组的最大值
var x=findMax(1,123,500,115,44,88);
function findMax(){
var i,max=0;
for(i=0;i<arguments.length;i++){
if(arguments[i]>max){
max=arguments[i];
}
}
return max;
}
计算数组中的值的和
var x=findMax(1,123,500,115,44,88);
function sumAll(){
var i,sum=0;
for(i=0;i<arguments.length;i++){
sum+=arguments[i];
}
return sum;
}
2)arguments 是函数内置(天生自带的)接收参数的机制
(1)是一个函数内置的接收参数的集合,arguments获取的是一个类数组。
(2)有一个叫做length的属性:arguments.length获取传递参数的个数以数字作为索引,索引从0开始逐级的递增,索引代表第几个传递进来的参数值arguments[0] 第一个参数值 arguments[1] 第二个参数值 arguments[索引] 第索引+1个参数值。
function fn(){
var total=0;
for(var i=0; i<argument.length;i++){
var cur=argument[i];
total+=cur;
}
console.log(total);
}
3)自己独有的属性:callee 指向当前正在执行的函数。 arguments.callee代表的是函数本身
function foo(x,y,z){
console.log(arguments.length); //2
console.log(arguments[0]); //1
arguments[0]=10;
console.log(x); //有绑定关系,形参x被修改为10
arguments[2]=100; //z未传入
console.log(z); //没有绑定关系,z仍然是undefined
console.log(arguments.callee===foo); //true,严格模式禁止使用
}
foo(1,2);
console.log(foo.length); //3
console.log(foo.name); //"foo"
好处:使得编写一个无须指定参数个数的函数成为可能。
foo.length拿到形参的个数。在函数内和函数外都有效。foo.length===arguments.callee.length
arguments.length拿到实际传参的个数。
arguments.callee当前正在执行的函数
foo.name拿到函数名。
坑:尝试通过arguments[2]=100修改未传入的z的值,z还是undefined。就是说:参数如果没传进来的话,arguments和参数没有改下修改这样的绑定关系。
5、函数的递归
callee是arguments对象的一个属性。它可以用于引用该函数的函数体内当前正在执行的函数。
函数的递归,即一个函数在通过名字调用自身的情况下构成的:
通过使用argument.callee代替函数名://arguments.callee是一个指向正在执行的函数的指针
function factorial(num){
if(num<=1){
return 1;
}else{
return num*arguments.callee(num-1);
}
}
本人是以网络视频与网络文章的方式自学的,并按自己理解的方式总结了学习笔记。有不正确之处请各位高手多多指点,一起学习进步。【VX:czlingyun 暗号:CSDN】
这篇关于最详细的JS学习笔记(连载)第二章、函数(arguments)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!