2013-12-10 11 views
1

컴파일 된 TypeScript (CoffeeScript로 시도 됨)의 출력을 가져 와서 WebStorm에 넣었습니다. 내가 할 때, JSHint는 "Snake 함수의 내부 선언을 위해"Snake가 이미 정의되어있다 "고 불평한다.JSHint는 "이미 정의되었습니다"IIFE 모듈 내부의 오류가 실제로 유효합니까?

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

내부 변수가 잠재적으로 혼란 스러울 수있는 같은 이름의 외부 변수를 섀도 잉하기 때문에 불편할 수 있습니다.

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

이 다른 SO 답변에 따르면,이 문제를 해결 2013 년 7 월 만들어진 커밋. var에가 외부 범위 뭔가에 같은 이름을 가진 정의 될 때 Douglas Crockford stated은 (JSLint에 대해)

JSLint는 이제 경고합니다. 독자 이 그가보고있는 변수를 쉽게 알 수 없기 때문에 이것은 혼란 스럽습니다. 새 변수가 실수로 이전 변수를 숨기므로 가끔 오류가 발생합니다. 경우에는 이전 버전이 의도 한 것입니다.