<span style="font-size:18px;">function functionName(arg0, arg1, ... argN) {statements }</span> ECMAScript规定的函数声明方式有三种:<span style="font-size:18px;">function box(num1,num2){return num1+num2; }</span> (2)使用变量初始化什声明函数<span style="font-size:18px;">var box=function(num1,num2){return num1+num2; }</span> (3)使用Function构造函数声明function box(){document.write("我是中国人!"); } box();//函数调用 运行的结果为:我是中国人!function box(name,age) {document.write("你的姓名是:"+name+"你的年龄是:"+age); } box("张三","24");//函数调用 运行的结果为:你的姓名是:张三function box(){return "我是中国人!"; } document.write(box()); 同上面的输出结果:我是中国人!function box(name,age){return "你的姓名是:"+name+"<br/>"+"你的年龄是:"+age; } document.write(box("张三","24"));//函数调用 document.write("<hr/>"); var demo=box("李四","23");//也可以重新赋值新的函数 document.write(demo); 运行的结果为:
(4)作为值的函数(比较特殊)
首先我们来看一个函数作为常规的变量的例子:
function box(sum,num){return sum+num;//这里传递的是函数的返回值和普通的变量一样 } function sum(num){return num+10; } var result=box(sum(10),10); document.write("result="+result); 页面的输出结果为:result=30function box(sum,num){return sum(num);//这里传递的是函数 } function sum(num){return num+10; } var result=box(sum,10); document.write("result="+result); 页面的输出结果为:result=20function box(){return arguments[0]+"|"+arguments[1]; } document.write(box(1,2,3,4,5,6)); 输出的结果为:1|2。因此输出的显然与我们想要做的不符,那么怎么解决呢?function box(){return arguments.length; } document.write(box(1,2,3,4,5,6)); 输出:6function box(){var sum=0;if(arguments.length==0){return sum;}for(var i=0;i<arguments.length;i++){sum=sum+arguments[i];}return sum;//返回累加结果 } document.write(box(1,2,3,4,5,6)); 输出:21function box(num){if(num<=1){return 1;}else{return num*box(num-1);//递归} } document.write(box(4)); 输出:24function box(num){if(num<=1){return 1;}else{return num*arguments.callee(num-1)//递归} } document.write(box(4)); 输出:24var color="红色";//这里的color是全局变量,并且这个变量是window的属性 document.write(window.color+"<br/>"); document.write(this.color+"<br/>"); var box={color:"蓝色",//这里的color是box下的属性,是局部变量sayColor:function(){return this.color;//此时的this只能是box中的color} }; document.write(box.sayColor()+"<br/>");//局部的 document.write(this.color);//全局的 运行的结果为:
四、函数属性和方法
(1)JavaScript中的函数是对象,因此函数也有属性和方法。每个函数都包含两个属性:length和prototype。其中,length属性表示函数希望接受的命名参数的个数。
function box(num1,num2){return num1+num2; } document.write(box.length); 输出的结果;2function box(num1,num2){return num1+num2; } function sayBox(num1,num2){return box.apply(this,[num1,num2]);//this表示作用域,这里是window,[]表示box所需的参数 } function sayBox2(num1,num2){return box.apply(this,arguments);//arguments对象表示box所需的参数 } document.write(sayBox(10,10)+"<br/>"); document.write(sayBox2(10,10)); 输出的结果为:20function box(num1,num2){return num1+num2; } function callBox(num1,num2){return box.call(this,num1,num2);//区别apply()方法 } document.write(callBox(10,10)); 输出的结果为:20var color="红色";//全局变量 var box={color:"蓝色",//局部变量 }; function sayColor(){return this.color; } document.write(sayColor()+"<br/>");//作用域在Window document.write(sayColor.call(this)+"<br/>");//作用域在Window下 document.write(sayColor.call(window)+"<br/>");//作用域在Window下 document.write(sayColor.call(box));//作用域在box下,对象冒充 输出的结果为:
使用call()方法或者apply()方法来扩充作用域的最大好处就是对象不需要与方法发生任何耦合关系。也就是说,box对象和sayColor()方法之间不会有多余的关联操作,比如;box.sayColor=sayColor;
五、ECMAScript闭包
ECMAScrip最易让人误解的一点是,它支持闭包。闭包,指的是词法表示包括不被计算的变量的函数,就是说,函数可以使用函数之外定义的变量。
其实我在前面的博文已经使用到了闭包,比如在轻松学习JavaScript七:JavaScript的流程控制语句中使用的变量time就是全局变量,函数myFunction()使用这个全局变量,并不是函数本身定义的。还是看一下那个实例吧:
var time=new Date().getHours(); document.write("当前北京时间:"+time); function myFunction() {var x="";if (time<20){x="Good day";}document.getElementById("demo").innerHTML=x; } (1)简单的闭包实例var sMessage = "hello world"; function sayHelloWorld() {document.write(sMessage); } sayHelloWorld(); 在上面这段代码中,脚本被载入内存后,并没有为函数sayHelloWorld()计算变量sMessage的值。该数捕 sMessage的值只是为了以后的使用,也就是说,解释程序知道在调用该函数时要检查sMessage的值。sMessage将在函数调用sayHelloWorld()是在(最后一行)被赋值,显示消息"hello world"。var iBaseNum = 10;//全局变量 function addNum(iNum1, iNum2) {function doAdd() {return iNum1 + iNum2 + iBaseNum;}return doAdd(); } document.write(addNum(10,10)); 这里,函数addNum()包括函数doAdd()(闭包)。内部函数是一个闭包,因为它将获取外部函数的参iNum1和iNum2以及全局变量iBaseNum的值。 addNum()的最后一步调用了doAdd(),把两个参数和全局变量相加,并返回它们的和。这里要掌握的重要概念是,doAdd()函数根本不接受参数,它使用的值是从执行环境中获取的,因此输出的结果为:30。