JSHint“已定义”IIFE模块内部的错误真的有效吗?

时间:2013-12-10 17:50:30

标签: javascript jslint jshint module-pattern iife

我获取了一些已编译的TypeScript的输出(也尝试使用CoffeeScript)并将其放入WebStorm中。当我这样做时,JSHint抱怨“'Snake'已被定义为”Snake函数的内部声明。

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);

我真的有两个问题,但第一个是我的主要问题,我将给出答案。

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

1 个答案:

答案 0 :(得分:1)

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

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

根据其他SO回答,2013年7月就此行为做出了承诺。 Douglas Crockford stated(关于JSLint)

  

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