函数通常使用function关键字来定义,要么以函数定义语句的形式,要么以函数直接量表达式的形式。
函数也可以通过Function()构造函数来定义。
使用Function()构造函数通常比使用函数直接量要难,因此这一技术也并不常用;下面是Function()构造函数创建的一个例子:
var f = new Funcion("x","y","return x*y");
这行代码创建了一个新的函数,这个函数和使用下面熟悉的语法定义的函数基本相等;
function f(x,y){ return x*y; }
Function()构造函数期待任意数目的字符串参数。最后一个参数是函数的函数体,它可以包含任意多条Javascript的语句,每条语句用分号分开。构造函数的所有其他参数都是字符串,用来指定所定义的函数的参数的名字。如果定义一个没有接受参数的函数,只需要向构造函数传递一个字符串,也就是函数体;如下:
var f = new Function("return y");
注意,Function ()构造函数并没有被传递给任何一个参数来指定它所创建的函数的名字。和函数直接量一样,Function ()构造函数创建了匿名的函数。
关于Function ()构造函数,理解如下几点很重要:
• Function ()构造函数允许JavaScript代码被动态地创建并且在运行时编译;例如,全局eval()(参见本书第三部分)函数就是这种方式。
• Function ()构造函数解析函数体,并且每次被调用的时候都创建一个新的函数对象。如果构造函数的调用出现在一个循环中,或者出现在一个经常被调用的函数中,那么这个过程的效率就很低了。相反,出现在一个循环或者函数中的函数直接量或者嵌套的函数,并不会每次遇到的时候都编译。每次遇到一个函数直接量也不会创建不同的函数对象(尽管前面已经提到,在函数定义所在的词法作用域中捕获不同之处,可能需要一个新的闭包)。
• 最后,关于FunctionO函数非常重要的一点就是,它所创建的函数并不是使用词法作用威,相反,它们总是当作顶层的函数一样来编译,如下面的代码所示:
var y = "global";
function constructFunction() {
var y = "local";
return new Function("return y");
// Does not capture the local scope:
}
// This line displays "global" because the function returned by the
// Function() constructor does not use the local scope. Had a function
// literal been used instead, this line would have displayed "local".
alert(constructFunction{)()); // Displays "global"
引用自书籍《JavaScript 权威指南》