1、function f(x){return x*x;}                                                    //function函数,调用function语句;
2、var f=new funtion{"x","y","var z=x*y;return z;"}            //function()构造函数,
3、var f=funtion(x){return x*x;}                                            //函数直接量

第1种方式是一个语句,而另2种方式则是由javascript的表达式创建的,可以作为一个表达式来使用,可以方便地用在多种场合。对于那些只要使用一次并且不用命名的函数,就可以用第2,3种方式来创建。

第2种方式允许动态地建立和编译一个函数,这样,我们使用函数时,就不用限制在function语句预编译的函数体种。但是第2种方式创建的函数有个缺点,每次调用这个函数,即是调用了function()构造函数,都会解析函数体并且创建一个新的函数对象。如果这个函数要经常使用(例如用在循环体中),将会频繁调用构造函数,执行效率就会非常低。

第3种方式创建的函数是程序结构的一个静态部分,是一个表达式,可以用来定义匿名函数。用于循环体时,我们可以选择第3种方式来创建函数。

第2种方式的函数主体"var z=x*y;return z;"是作为字符串存在的,每次调用构造函数时就会作为参数传递给function(),被解析和编译一次。

第3种方式创建的函数只需要解析和编译一次,就可以多次使用,函数主体是标准的javascript语法。

第2种方式创建的函数总是被当作顶级函数来编译,下面这个摘录自《javascript权威指南(第四版)》的列子可以说明:

var y="global";
function constructFunction(){
    var y="local";
    return new Function("return y;");
}
alert(constructFunction());                     //显示global