【问题标题】:Is JSHint "is already defined" errors inside of IIFE modules really valid?IIFE 模块中的 JSHint “已定义”错误真的有效吗?
【发布时间】:2013-12-10 17:50:29
【问题描述】:

我将一些已编译的 TypeScript(也尝试过使用 CoffeeScript)的输出放入 WebStorm。当我这样做时,JSHint 会为 Snake 函数的内部声明抱怨“'Snake' is already defined”。

var __extends = this.__extends || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};
var Animal = (function () {
    function Animal(name) {
        this.name = name;
    }
    Animal.prototype.move = function (meters) {
        alert(this.name + " moved " + meters + "m.");
    };
    return Animal;
})();

var Snake = (function (_super) { 
    __extends(Snake, _super);
    function Snake(name) { //Warning registered here
        _super.call(this, name);
    }
    Snake.prototype.move = function () {
        alert("Slithering...");
        _super.prototype.move.call(this, 5);
    };
    return Snake;
})(Animal);

我可以使用/*jshint -W004 */ 禁用警告,但似乎警告无效,因为我们是在函数范围内。

现在是奇怪的部分。如果我将__extends 调用移到函数声明之后,错误就会消失。

function Snake(name) {
    _super.call(this, name);
}
__extends(Snake, _super);

我确实有 2 个问题,但第一个是我的主要问题,我将奖励我的答案。

  1. 此警告有效吗?
  2. __extends 调用移到函数声明下方会产生什么后果?

【问题讨论】:

    标签: javascript jslint jshint module-pattern iife


    【解决方案1】:

    似乎它可能在抱怨,因为内部变量正在隐藏同名的外部变量,这可能会造成混淆。

    https://stackoverflow.com/a/17852430/378151

    根据this other SO answer,2013 年7 月围绕此行为进行了提交。 Douglas Crockford stated(关于 JSLint)

    JSLint 现在会在定义的 var 同名时发出警告 外部范围内的东西。这是令人困惑的,因为读者 不能轻易说出他在看哪个变量。它有时是一个 错误,因为新变量不小心隐藏了旧变量。在 在某些情况下,旧的就是预期的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      相关资源
      最近更新 更多