功能与新功能的区别

时间:2011-01-28 19:11:26

标签: javascript function constructor new-operator

我有时会看到有人这样做Function('alert("hi")'),有时会看到new Function('alert("hi")')

两者之间有区别吗?

4 个答案:

答案 0 :(得分:6)

spec(第127页)说它们完全相同。

  

15.3.1.1功能(p1,p2,...,pn,body)

     

调用Function函数时   有一些参数p1,p2,...,pn,   body(其中n可能为0,即   没有“p”参数,在哪里   可能也没有提供身体)   采取以下步骤:

     
      
  1. 创建并返回一个新的Function对象,就像标准内置一样   构造函数函数用于新的   具有相同参数的表达式   (15.3.2.1)。
  2.   

但是,您应该不惜一切代价避免使用Function cinstructor 它需要eval传递给它的字符串; eval是邪恶的,也是缓慢的。

答案 1 :(得分:1)

new Function只有一种用法。就是这样:

var constructor = new Function;

// then this 

constructor.prototype = { 
    //...  stuff
};

// OR

constructor.prototype = new someOtherThing;

// then

var obj = new constructor;

如果要使用仅使用继承的空构造函数创建对象构造函数,基本上可以使用new Function

如果您希望某个功能执行任何操作,请根本不要使用Function

答案 2 :(得分:0)

要回答您的问题,Function(...)new Function(...)根据ECMA5 specs完全相同。

为了解释何时何地应该使用,答案很少。我知道我们使用Function(...)的一种情况,就是在创建自定义ASP.NET服务器控件时。我们经常会遇到[ServerControl].OnClientClick的影响,它指定在发生click事件时应在客户端运行的JavaScript字符串(在服务器端)。然后,我们将JS字符串放入Function中,并在满足特定条件时调用它。这也允许我们调用.call(...)函数来设置上下文并传入事件参数,就像从onclick属性调用JS一样。

答案 3 :(得分:0)

将Function构造函数作为函数调用(不使用new运算符)与将其作为构造函数调用具有相同的效果。

这意味着编写代码的方式相同:

var result1 = new Function('a', 'b', 'return a + b')
var result2 = Function('a', 'b', 'return a + b')

result1和result2相同。