我有时会看到有人这样做 Function('alert("hi")')
有时也会 new Function('alert("hi")')
两者之间有什么区别吗?
这两者之间有什么区别吗?规范 (第127页)说它们是相同的。
15.3.1.1 函数 (p1, p2, ... , pn, body)
当
Function
调用一些参数 p1, p2, ... , pn, body (其中 n 可能是 0,即没有 "p "参数,也可能没有提供 body),采取以下步骤。
- 创建并返回一个新的Function对象,就像在一个新的表达式中使用标准内置构造函数一样,参数相同(15.3.2.1)。
然而,您应该避免使用 Function
构造者不惜一切代价。它需要 eval
你传给它的弦。eval
是恶,也是慢。
只有一种用法 new Function
. 是这样的。
var constructor = new Function;
// then this
constructor.prototype = {
//... stuff
};
// OR
constructor.prototype = new someOtherThing;
// then
var obj = new constructor;
基本上你可以用 new Function
如果你想用一个只使用继承的空构造函数来创建一个对象构造函数。
如果你想让一个函数做任何事情,那么不要使用 Function
完全没有。
回答你的问题。Function(...)
还有... new Function(...)
是完全一样的,根据 ECMA5规格.
为了说明何时何地应该使用这种方法,答案是很少。据我所知,有一种情况是我们使用了 Function(...)
而在创建自定义ASP.NET服务器控件时。我们经常会有一些类似于 [ServerControl].OnClientClick
,它指定了一个JavaScript字符串(在服务器端),当点击事件发生时,它应该在客户端运行。然后,我们将JS字符串放入一个Function中,并在满足特定条件时调用它。这也允许我们调用 .call(...)
函数来设置上下文,并传递事件参数,就像JS从一个 onclick
属性。
作为函数调用Function构造函数(不使用 new
操作符)与调用它作为构造函数的效果是一样的。
也就是说,如果你这样做,对代码来说是一样的。
var result1 = new Function('a', 'b', 'return a + b')
var result2 = Function('a', 'b', 'return a + b')
result1和 result2是一样的.