javascript的函数定义的区别

第一段代码,输出结果为:NaN
<script type="text/javascript">
var sum=new function(a,b)
{
alert(a+b);
}
sum('a','b');
</script>

第二段代码,输出结果为ab
<script type="text/javascript">
var sum=function(a,b)
{
alert(a+b);
}
sum('a','b');
</script>
这是why啊?

1:调用关键字function来构造

 function distance(x1,x2,y1,y2) 
  { 
    var dx=x2-x1; 
    var dy=y2-y1; 
    return Math.sqrt(dx*dx+dy*dy); 
  }


2:使用Function()构造函数(请注意与上面的大小写)

var f=new Function*"x","y","return x*y");

这行代码创建了一个新函数,该函数和你所熟悉的语法定义的函数基本上时等价的:

function f(x,y) 
  { 
      return x*y; 
  }

Functino()构造函数可以接受任意多个字符串参数。它的最后一个参数时函数的主体,其中可以包含任何JavaScript语句,语句之间用分号分隔。其他的参数都是用来说明函数要定义的形式参数名的字符串。如果你定义的函数没有参数,那么可以只需给构造函数传递一个字符串(即函数的主体)即可。 
  注意,传递给构造函数Function()的参数中没有一个用于说明它要创建的函数名。用Function()构造函数创建的未命名函数有时被成为“匿名函数”。 
  你可能非常想知道Function()构造函数的用途是什么。为什么不能只用function语句来定义所有的函数呢?原因是Function()构造函数允许我们动态地建立和编译一个函数,它不会将我们限制在function语句预编译的函数体中。这样做带来的负面影响效应就是每次调用一个函数时,Function()构造函数都要对它进行编译。因此,在循环体中或者在经常使用的函数中,我们不应该频繁地调用这个构造函数。 
  使用Function()构造函数的另一个原因是它能够将函数定义为JavaScript表达式的一部分,而不是将其定义一个语句,这种情况下使用它就显得比较的方面,甚至可以说精致。


 3:函数直接量 
  函数直接量是一个表达式,它可以定义匿名函数。函数直接量的语法和function语句非常相似,只不过它被用作表达式,而不是用作语句,而且也无需指定函数名。下面的三行代码分别使用function()语句、Funciont()构造函数和函数直接量定义了三个基本上相同的函数:

 function f(x){return x*x}; 
  var f=new Function("x","return x*x;"); 
  var f=function(x){reurn x*x};


在JavaScript1.1中,可以使用构造函数Function()来定义函数,在JavaScript1.2和其后的版本中,还可以使用函数直接量来构造函数。你应该注意这两种方法之间的重要差别。 
   
  首先,构造函数Function()允许在运行时动态地创建和编译JavaScript代码。但是函数直接量却是函数结构的一个静态部分,就像function语句一样。 
  其次,作为第一个差别的必然结果,每次调用构造函数Function()时都会解析函数体并且创建一个新东汉数对象。如果对构造函数的调用出现在一个循环中,或者出现在一个经常被调用的函数中,这种方法的效率非常低。另一个方面,函数直接量或出现在循环和函数中的嵌套函数不是在每次调用时都被重新编译,而且每当遇到一个函数直接量时也不创建一个新的函数对象。 
  Function()构造函数和函数之间量之间的第三点差别是,使用构造函数Function()创建的函数不使用词法作用域,相反的,它们总是被当作顶级函数来编译,就像下面代码所说明的那样:

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-10-30
第一段:new function使用系统内置函数对象来构建一个函数
var sum=new function(a,b) 相当于:

function 匿名类();
var sum=new 匿名类(a,b);

当你执行new的时候就已经从Function创建了一个实例,而a , b 不存在 ,
所以输出 a+b 按照数学运算 空值相加得到 NaN

第二段:var sum=function(a,b) 相当于:function sum(a,b)
所以可以输出:ab;本回答被提问者和网友采纳
第2个回答  2013-02-19
第一段,其实是创建了一个匿名类的对象,alert(a+b)其实相当于是构造函数里执行的东西,这一段在new这个对象的时候就执行了,a和b都是空的,所以NaN了,之后那句sum('a','b')是会报错的,你在火狐或者谷歌的浏览器里看一下就知道了,并且这个sum是Object类型

第二段是一个正常的赋值方式的函数定义
第3个回答  2013-02-19
第一个,当你执行new的时候就已经从Function创建了一个实例(即sum ),而此时的a和b变量在执行环境中是不存在的,即a = b = undefined,因此a+b的值为NaN,随后跟随的sum('a','b')没有意义
第4个回答  2013-02-19
定义一个函数有几种方法
//1、直接定义
function sum(a,b){
alert(a+b);
}

//2、使用Function的构造函数定义
var sum = new Function("a","b","alert(a+b)");

上面两种定义方式都可以在后面调用sum(1,2)来运行。

你定义的第一种是new 了一个对象而不是函数,在new对象时a和b都没有赋值所以打出了NaN
相似回答