【问题标题】:jshint and Function() gets: Missing 'new' prefix when invoking a constructorjshint 和 Function() 获取:调用构造函数时缺少“新”前缀
【发布时间】:2015-02-07 10:26:40
【问题描述】:

我想使用“noop”函数(我的意思是,一个什么都不做的函数,仅用于模型目的)。所以我写:

var noop = Function();

但是当我对文件运行 jshint 时,我收到以下错误:

Missing 'new' prefix when invoking a constructor.

当我将Function() 更改为Function.prototype 时,此错误消失,但我更喜欢第一个。

为什么会出现这个错误?如何防止出现这种提示?

提前致谢。

【问题讨论】:

  • 任何在调用时第一个字符为大写的函数都被认为是一个新实例。你可以做 var noop = function(){} 这会给你同样的结果。另外,直接使用 Function() 被认为是一种不好的做法。
  • 为什么这是一种不好的做法?
  • 由 Function() 创建的函数在调用时会被解析。这比使用与其余代码一起解析的 function(){} 表达式效率低。使用 Function() 创建的函数始终在全局范围内创建。不要误会我的意思,它有它的位置。使用 Function() 而不是 eval 被认为是一种更好的做法。那是我会使用它的地方。在大多数情况下使用命名函数。

标签: javascript jshint


【解决方案1】:

你的表情其实是一样的

var noop = new Function();

var noop = new Function;

你可以看到它每次运行Function() === Function()都会创建一个新对象

我看到在生产中使用的最短和最安全的替代方案是:

var noop = Number;

jshint 应该很酷。一个优点是它不会在每次使用时都创建一个新对象。

更新: 只是为了完整起见,jshint 抱怨因为在没有 new 的情况下调用构造函数(大写的第一个字母表示构造函数)可能很危险,因为这些函数中的 this 在 ES3 中是 window 并且对 this 的任何更改都会修改全局对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    相关资源
    最近更新 更多