Js函数其实是个对象,但我总拿它和Java的方法一样对待,因为它的写法明明就是一个“函数”。
其实我们常用的定义函数的写法只是写法之一,写法其实有三种:
1 声明式的(静态的)
2 对象式的(动态的)
3 字面量式的(也被称为函数表达式)
下面分别介绍一下。
1 声明式的
写法:function func(param1,param2…){…};
这是最常用的,它是静态的,和Java的静态方法类似,在页面加载时就被解析,且只解析一次。这个我就不细说了,程序员都知道。
2 对象式的
写法:var func =new Function("param1","param2",..."function body");
例子:var sayHi=new Funciton("toWhom","alert('hi'+toWhom)");
说明:构造函数的参数个数不确定,倒数第一个形参就是函数体,其它的形参就是函数的形参。
对象式(其实这是我给命的名,书中叫动态式我觉得欠妥,这种写法明明就是在创建对象)是动态的,因为它构造函数的参数都是字符串,可以动态改变。正是如此,函数体每创建一次,浏览器都要重新解析,性能肯定不如静态方式,但它也有它的优势,因为你可用利用它动态创建一个函数。
3 字面量式
写法:var func=function [函数名可选,函数内可见](parms){...};
例子:var func=function funcTest(id){alert(id)}
说明:这种写法的函数名,只有在函数体内可见,可用于实现递归函数。
字面量式多用于事件注册,如:obj.οnclick=function(this){alert(this.id)}。
无论用何种写法,实际上都是创建了一个函数对象,没有本质的区别。不能凭经验想当然把js函数看作是其他语言的“函数”,那样就会浪费它的灵活性,它可以像其它类型实例一样被当作参数传递。