在 JavaScript 中,函数对象对应的类型是 Function,正如数组对象对应的类型是 Array,
日期对象对应的类型是 Date 一样,可以通过 new Function()来创建一个函数对象,也可以通
过 function 关键字来创建一个对象。为了便于理解,我们比较函数对象的创建和数组对象的创
建。先 看数组对象:下面两行代码都是创建一个数组对象 myArray:
var myArray=[];
//等价于
var myArray=new Array();
同样,下面的两段代码也都是创建一个函数 myFunction:
function myFunction(a, b){
return a+b;
}
//等价于
var myFunction=new Function("a", "b","return a+b");
通过和构造数组对象语句的比较,可以清楚的看到函数对象本质,前面介绍的函数声明是上
述代码的第一种方式,而在解释器内部,当遇到这种语法时,就会自动构造一个Function 对象,
将函数作为一个内部的对象来存储和运行。从这里也可以看到,一个函数对象名称(函数变量)
和一个普通变量名称具有同样的规范, 都可以通过变量名来引用这个变量,但是函数变量名后
面可以跟上括号和参数列表来进行函数调用。
用 new Function()的形式来创建一个函数不常见,因为一个函数体通常会有多条语句,如果
将它们以一个字符串的形式作为参数传递,代码的可读性差。下面介绍一下其使用语法:
var funcName=new Function(p1,p2,..., pn,body);
参数的类型都是字符串,p1 到 pn 表示所创建函数的参数名称列表 ,body 表示所创建函数的函
数体语句,funcName 就是所创建函数的名称。可以不指定任何参数创建一个空函数,不指定
funcName 创建一个无名函数,当然那样的函数没有任何意义。
需要注意的是,p1 到 pn 是参数名称的列表 ,即 p1 不仅能代表一个参数 ,它也可以是一个逗号
隔开的参数列表,例如下面的定义是等价的:
new Function("a", "b", "c", "return a+b+c")
new Function("a, b, c", "return a+b+c")
new Function("a,b", "c", "return a+b+c")
JavaScript引入Function类型并提供new Function()这样的语法是因为函数对象添加属性和方
法就必须借助于 Function 这个类型。
函数的本质是一个内部对象,由 JavaScript解释器决定其运行方式。通过上述代码创建的函数,
在程序中可以使用函数名进行调用。本节开头列出的函数定义问题也得到了解释。注意可直接在
函数声明后面加上括号就表示创建完成后立即进行函数调用,例如:
var i=function (a,b){
return a+b;
}(1, 2);
alert(i);
这段代码会显示变量 i 的值等于 3。i 是表示返回的值,而不是创建的函数,因为括号“(”比等号
“=”有更高的优先级。这样的代码可能并不常用,但当用户想在很长的代码段中进行模块化设计
或者想避免命名冲突,这是一个不错的解决办法。
需要注意的是,尽管下面两种创建函数的方法是等价的:
function funcName(){
//函数体