函数和新函数的区别

问题描述 投票:7回答:3

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

两者之间有什么区别吗?

javascript function constructor new-operator
3个回答
6
投票

这两者之间有什么区别吗?规范 (第127页)说它们是相同的。

15.3.1.1 函数 (p1, p2, ... , pn, body)

Function 调用一些参数 p1, p2, ... , pn, body (其中 n 可能是 0,即没有 "p "参数,也可能没有提供 body),采取以下步骤。

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

然而,您应该避免使用 Function 构造者不惜一切代价。它需要 eval 你传给它的弦。eval 是恶,也是慢。


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 完全没有。


0
投票

回答你的问题。Function(...) 还有... new Function(...) 是完全一样的,根据 ECMA5规格.

为了说明何时何地应该使用这种方法,答案是很少。据我所知,有一种情况是我们使用了 Function(...)而在创建自定义ASP.NET服务器控件时。我们经常会有一些类似于 [ServerControl].OnClientClick,它指定了一个JavaScript字符串(在服务器端),当点击事件发生时,它应该在客户端运行。然后,我们将JS字符串放入一个Function中,并在满足特定条件时调用它。这也允许我们调用 .call(...) 函数来设置上下文,并传递事件参数,就像JS从一个 onclick 属性。


0
投票

作为函数调用Function构造函数(不使用 new 操作符)与调用它作为构造函数的效果是一样的。

也就是说,如果你这样做,对代码来说是一样的。

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

result1和 result2是一样的.

© www.soinside.com 2019 - 2024. All rights reserved.