1

我将一些已编译的 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将调用移到函数声明下方有什么后果?
4

1 回答 1

1

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

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

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

JSLint 现在会在定义的 var 与外部作用域中的某物具有相同名称时发出警告。这是令人困惑的,因为读者无法轻易分辨出他正在查看哪个变量。有时这是一个错误,因为新变量意外隐藏了旧变量。在某些情况下,旧的就是预期的。

于 2013-12-10T22:50:08.857 回答