Function(函数)类型实际上是对象,每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法,由于函数是对象,因此函数名实际上也是一个指向函数对象的指针
声明方式
function box(number1,number2){ //1.普通函数声明的方式 return number1*number2; } var box=function(num1,num2){ //2.使用变量初始化函数 return num1+num2; } var box=new Function("num1","num2","return num1+num2") //3.使用new的构造函数来声明函数(不推荐使用 会解析2次代码)
作为值的函数
函数名本身就是变量,所以函数也可以作为值来使用,也就是说,不仅可以像传递参数一样把一个函数
传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回
function box(sum,name){ return sum+name; } function sum(id){ return id+10; } var a=box(sum(10),10); //sum(10)这里传递的是函数的返回值,和普通的变量一样没区别 alert(a);
function box(sum,name){ return sum(name); } function sum(id){ return id+10; } var a=box(sum,10); //sum在这里是一个函数,当作参数传递到另一个函数中,而不是函数的返回值 alert(a);
函数的外部属性
在函数内部,有两个特殊的对象,arguments和this。arguments是一个类数组对象,包含传入函数中的所有参数,主要用途是保存函数参数,但这个对象还有一个名字叫callee的属性,该属性是一个指针,指向拥有
arguments对象的函数。
function box(num){ if (num<=1) { return 1; }else{ return num*box(num-1) //调用自身理解 第一步调用box(4) 4>1返回4*box(3),3>1返回4*3*box(2),2>1 返回4*3*2*box(1),1=1 返回1 最后结果4*3*2*1=24 } } alert(box(4));
利用arguments.callee属性来代替
function box(num){ if (num<=1) { return 1; }else{ return num*arguments.callee(num-1) //arguments.calle是一个指针可以指向拥有这个arguments函数(也就是自身的意思) } }
this:
其行为与java、C#中的this大致相似,换句话说this引用的是函数据以执行操作的对象,或者说函数调用语句所处的那个作用域,
ps:当在全局作用域中调用函数时,this对象引用的就是window。
//window是一个对象,是js里面最大的对象,是最外围的 alert(window); //返回object window alert(this); //返回object window 所以window=this var color="红色的"; //这里的color 就是全局变量,而这个变量又是window的属性 alert(window.color); //返回红色的 这里已经很好的说明color是window下面的属性
window.color="红色的"; //相当与 var color="红色的"; alert(this.color); //返回红色的 因为这里的this对象就是window
this.color="蓝色的"; alert(color); //这里的color是window下的属性,也就是全局变量 var box={ //创建box对象 属性color 方法sayColor color:"红色的", //这里的color是box属性下的color,也就是局部变量 sayColor:function(){ alert(this.color); //这里的this代表的是box对象 } } box.sayColor(); //掉用box下的sayColor 不要直接写SayColor
window.color="蓝色的"; function sayColor(){ alert(this.color); } sayColor(); //返回蓝色的,这里的this 没有对象把它包含,它还是winsow的
window.color="红色的"; function sayColor(){ alert(this.color); } //sayColor(); //返回蓝色的,这里的this 没有对象把它包含,它还是winsow的 var box={ color:'蓝色的' } box.sayColor=sayColor; //这段代码相当于 在box里面加了sayColor:function (){alert(this.color)} box.sayColor();
函数的内部属性
length:来获取函数的参数的个数
function box(name,age){ return name*age } alert(box.length); //返回函数的参数个数
prototype属性
它是保存所有实例方法的真正所在,也就是原型,这个属性我们将在面向对象第一章详细介绍。而prototype下有两个方法,apply()和call(),每个函数都包含这两个非继承而来的方法。这两个方法的用途都在特定的作用域中调用函数
实际上等于设置函数体内this对象的值
语法:
对象.apply(对象,[参数1,参数2.....]);
function box(name,age){ return name+age } //利用apply()方法来冒充执行box function sum(name,age){ return box.apply(this,[name,age]) //this表示windows下的作用域,[]表示传递的参数 } alert(sum(1,6)); //调用sum方法返回结果和box一样 冒充成功
function box(name,age){ return name+age } //利用apply()方法来冒充执行box function sum(name,age){ return box.apply(this,[name,age]) //this表示windows下的作用域,[]表示传递的参数 apply()和call可以冒充另外一个函数 } //alert(sum(1,6)); //调用sum方法返回结果和box一样 冒充成功 function sum2(name,age){ return box.apply(this,arguments); //如果参数过多我们可以使用argument类数组来代替参数 } alert(sum2(10,20));
call()方法和apply相同,他们的区别仅仅在于接收参数的方式不同,对于call()方法而言,第一个参数是作用域 没有变化,变化只是其余的参数都是直接传递给函数的
function box(name,age){ return name+age } //利用apply()方法来冒充执行box function sum(name,age){ return box.call(this,name,age) //this表示windows下的作用域,[]表示传递的参数 apply()和call可以冒充另外一个函数 } alert(sum(10,20));