1,函数的arguments
1 function say(num) { 2 /* 3 * 在函数对象中有一个属性叫做arguments,通过这个属性可以获取相应的参数值,这个属性 4 * 是一个数组,其实就是传递进来的参数 5 */ 6 alert(arguments.length); 7 for(var i=0;i<arguments.length;i++) { 8 alert(arguments[i]); 9 } 10 alert(num); 11 } 12 /** 13 * 在arguments这个对象中有一个callee的方法,arguments.callee(arg)可以反向的调用 14 */ 15 16 // say(1,2,3); 17 function factorial(num) { 18 if(num<=1) return 1; 19 //此时和函数名耦合在一起 20 // else return num*factorial(num-1); 21 //以下就实现了函数名的解耦合,在js中通常都是使用这种方式做递归 22 else return num*arguments.callee(num-1); 23 24 }
2,this
当需要创建一个类的时候,设置类的属性和方法需要通过this关键字来引用。
1 var color = "red"; 2 function showColor() { 3 alert(this.color); 4 } 5 /** 6 * 创建了一个类,有一个color的属性和一个show的方法 7 */ 8 function Circle(color) { 9 this.color = color; 10 this.showColor = showColor; 11 } 12 13 var c = new Circle("yellow"); 14 //使用c来调用showColor方法,等于调用了showColor()方法 15 //此时的this是c,所以color就是yellow 16 c.showColor();//yellow 17 //此时调用的对象等于是window,showColor的this就是window,所以就会找window中color 18 showColor();//red
3,函数的属性length
函数的length就表示该函数所期望的参数值。
1 function fn2(num1,num2) { 2 } 3 alert(fn2.length);//2
4,apply()和call()方法
调用一个对象的一个方法,以另一个对象替换当前对象。
1 function sum(num1,num2) { 2 return num1+num2; 3 } 4 5 function callSum1(num1,num2) { 6 //使用sum这个函数来完成一次调用,调用的参数就是callSum1这个函数的参数 7 //apply的第二个参数表示一组参数数组 8 return sum.apply(this,arguments); 9 } 10 11 function callSum2(num1,num2) { 12 //关键就是第二个参数是数组 13 return sum.apply(this,[num1,num2]); 14 } 15 alert(callSum1(12,22)); 16 alert(callSum2(22,32)); 17 18 function callSum3(num1,num2) { 19 //call是通过参数列表来完成传递,其他和apply没有任何区别 20 return sum.call(this,num1,num2); 21 } 22 alert(callSum3(22,33));
(2)中使用call和apply之后,对象中可以不需要定义方法了
showColor.call(this);//使用上下文来调用showColor,结果是red
showColor.call(c);//上下文对象是c,结果就是yellow