我有时看到人们这样写 Function('alert("hi")')
有时候他们写成 new Function('alert("hi")')
这两种方式有什么不同吗?
我有时看到人们这样写 Function('alert("hi")')
有时候他们写成 new Function('alert("hi")')
这两种方式有什么不同吗?
规范(第127页)指出它们是相同的。
15.3.1.1 函数 (p1, p2, … , pn, body)
当使用一些参数 p1、p2、…、pn 和 body(其中 n 可能为 0,即没有“p”参数,而且 body 也可能未提供)调用
Function
函数时,将执行以下步骤:
- 创建并返回一个新的函数对象,就好像在新的表达式中使用了标准内置构造函数 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
。
new Function
的唯一有效用法。 - Raynosnew
会创建一个唯一的this
作用域。这更清楚地说明了这一点:http://jsfiddle.net/Raynos/GJXAk/4/。@CMS 虽然感谢你的解释。 - Raynos回答你的问题:根据ECMA5规范,Function(...)
和new Function(...)
是完全相同的。
关于何时何地应该使用它,答案是很少。我知道有一种情况我们使用了Function(...)
,那就是在创建自定义ASP.NET服务器控件时。我们经常有类似于[ServerControl].OnClientClick
的东西,它指定了一个JavaScript字符串(在服务器端),当单击事件发生时应在客户端运行。然后我们将JS字符串放入一个函数中,并在满足特定条件时调用它。这也允许我们调用.call(...)
函数来设置上下文并传递事件参数,就像从onclick
属性调用JS一样。
作为函数调用函数构造器(不使用new
运算符)与作为构造器调用它具有相同的效果。
这意味着如果您这样做,代码是相同的:
var result1 = new Function('a', 'b', 'return a + b')
var result2 = Function('a', 'b', 'return a + b')
result1和result2是相同的。
eval
,而function() { alert("hi"); }
同样有效?这是什么鬼啊,人类)。 - user395760