我们已经知道,函数通常使用function关键字来定义,要么以函数定义语句的形式,要么以一个函数直接量表达式的形式。除了这两种方式,函数也可以通过Function( )构造函数来定义。使用Function( )构造函数通常比使用函数直接量要难,因此这一技术实际上并不常用。下面是使用Function( )构造函数来创建一个函数的例子:
var f=new Function("x","y","return x*y;");
这行代码创建了一个新的函数,这个函数和使用下面的语法定义的函数基本相等:
function(x,y){
return x*y;
}
Function( )构造函数期待任意数目的字符串参数。最后一个参数是函数的函数体,它可以包含任意多条JavaScript语句,每条语句用分号分开。构造函数的所有其他参数都是字符串,用来指定所定义的函数的参数的名字。如果定义一个没有接受参数的函数,只需要向构造函数传递一个字符串,也就是函数体。
注意,Function( )构造函数并没有被传递给任何一个参数来指定它所创建的函数的名字。和函数直接量一样,Function构造函数创建了匿名函数。
关于Function( )构造函数,理解以下几点很重要:
⑴ Function( )构造函数允许JavaScript代码被动态地创建并且在运行时编译。例如全局eval( )函数就是这种方式。
⑵ Function( )构造函数解析函数体,并且每次被调用的时候都创建一个新的函数对象。如果构造函数的调用出现在一个循环中,或者出现在一个经常被调用的函数中,那么这个过程的效率就很低了。相反,出现在一个循环或者函数中的函数直接量,并不会每次遇到的时候都编译。每次遇到一个函数直接量也不会创建不同的函数对象。
⑶ 最后,关于Function( )函数非常重要的一点就是,它所创建的函数并不使用词法作用域,相反,它们总是当作顶层的函数一样来编译。如下面的代码所示:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<body>
<script>
var y="global";
function constructorFunction(){
var y="local";
return new Function("return y");
}
alert(constructorFunction()()); //Displays "global"
</script>
</body>
</html>