我有时会看到有人这样做Function('alert("hi")')
,有时会看到new Function('alert("hi")')
两者之间有区别吗?
答案 0 :(得分:6)
spec(第127页)说它们完全相同。
15.3.1.1功能(p1,p2,...,pn,body)
调用
Function
函数时 有一些参数p1,p2,...,pn, body(其中n可能为0,即 没有“p”参数,在哪里 可能也没有提供身体) 采取以下步骤:
- 创建并返回一个新的Function对象,就像标准内置一样 构造函数函数用于新的 具有相同参数的表达式 (15.3.2.1)。
醇>
但是,您应该不惜一切代价避免使用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相同。