【问题标题】:difference between Function and new Function函数和新函数的区别
【发布时间】:2011-01-28 19:11:26
【问题描述】:

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

这两者有区别吗?

【问题讨论】:

  • 除非在极少数情况下,否则您也不应该这样做。
  • 它们的相似之处在于它们是DoingItWrong 的实例(暗示eval,而function() { alert("hi"); } 也同样有效?WTF,人)。
  • @Raynos 那么应该什么时候使用呢?
  • @user:在极少数情况下。如果你不得不问,就不要问。

标签: javascript function constructor new-operator


【解决方案1】:

spec(第 127 页)说它们是相同的。

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

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

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

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

【讨论】:

  • 啊!请带有指向规范的链接的部门/页码。
  • @SLaks 没有将 #15.3 添加到 url 是他们的错。
  • @Raynos:这是一个 PDF。如果他们尝试过(AFAIK),他们就无法做到这一点
  • @SLaks:不客气。 @CMS 前几天在评论中引用了它。
  • @Raynos:可悲的是,这就是我的能力范围。参考别人的辛勤工作。 ;o)
【解决方案2】:

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(){} 好在哪里?
  • @SLaks 这是风格问题。但它仍然是 new Function 的唯一有效用法
  • 信不信由你,jQuery 使用new Function(...)
  • @SLaks 这只是使用 eval 而不使用 eval。 new Function vs eval 有什么论据吗?
  • @Raynos,我会说“Function”构造函数比“eval”更安全,因为它使用全新的变量/词法环境(您只能访问在全局范围内声明的标识符,或者在函数本身内,而不是在调用者的范围内)。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    这意味着如果你这样做,代码是一样的:

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

    result1 和 result2 相同。

    【讨论】:

      猜你喜欢
      • 2013-02-14
      • 2018-07-10
      • 2016-03-02
      • 1970-01-01
      • 2017-11-03
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      相关资源
      最近更新 更多