JSHINT가 이것이 엄격한 위반이라고 불평하는 이유는 무엇입니까?


98

이 키워드를 사용하고 모듈 패턴을 드러내는 Strict Violation 의 중복이라고 생각합니다.

이 코드가 있습니다.

function gotoPage(s){
    if(s<=this.d&&s>0){this.g=s; this.page((s-1)*this.p.size);}
}

function pageChange(event, sorter) {
    var dd = event.currentTarget;
    gotoPage.call(sorter, dd[dd.selectedIndex].value);
}

그리고 JSHINT (JSLINT)가 불평하고 있습니다. "엄격한 위반"이라고되어 ​​있습니다. 강조 표시된 라인 :

여기에 이미지 설명 입력

Function.call()인스턴스를 사용한 다음 참조하는 것이 부적절합니까?

이것은 나쁜 스타일로 간주됩니까?


자세한 오류 메시지없이 "엄격한 위반"이라고 만 표시됩니까?
stivlo

나는 문제를 재현 할 수 없으며 JSHint와 JSLint를 통해 코드를 실행했으며 아무것도 불평하지 않는 것 같습니다.
Peter Olson

54
말도 안되는 한 줄짜리 코드에 넣지 않으면 진단하기가 훨씬 쉬울 것입니다. : P.
Domenic 2011 년

1
나는 이것을 다른 질문에서 봤습니다 (지금은 찾을 수 없습니다). 그것은 사용과 관련이 있습니다 this. JSLint가 왜이를 Strict Violation이라고 부르는지 모르겠지만 this함수 의 값을 정의하지 않으면 undefinedStrict 모드에 있을 것임을 알고 있습니다 . 분명히 정의 this하고 있으므로 문제가되지 않아야합니다.
user113716

2
config json에서 이러한 가능한 엄격한 위반 을 무시할 수 "-W040":true있지만 json에는 주석이 없기 때문에 그 이유를 누구에게도 말할 수 없습니다.
kojiro 2013

답변:


124

JSHint는 "엄격한 위반 가능성"이라고 말합니다. 왜냐하면 여러분이 this알 수있는 한 메서드가 아닌 것을 내부에서 사용하고 있기 때문 입니다.

엄격하지 않은 모드에서 호출 gotoPage(5)은 브라우저에서 this전역 개체에 바인딩 됩니다 window. 엄격 모드에서, thisundefined, 당신은 곤경에 얻을 것입니다.

아마도 바운드 this컨텍스트 (예 : gotoPage.bind(myObj)(5)또는)를 사용 하여이 함수를 호출하는 것을 의미합니다 gotoPage.call(myObj, 5). 그렇다면 오류를 생성하지 않으므로 JSHint를 무시할 수 있습니다. 그러나 this분명히 메소드가 아닌 내부를 사용 하는 것은 매우 혼란 스럽기 때문에 코드를 읽는 사람에게는 코드가 명확하지 않다는 것을 알려줍니다 . 단순히 개체를 매개 변수로 전달하는 것이 좋습니다.

function gotoPage(sorter, s) {
    if (s <= sorter.d && s > 0) {
        sorter.g = s;

        sorter.page((s - 1) * sorter.p.size);
    }
}

function pageChange(event, sorter) {
    var dd = event.currentTarget;
    gotoPage(sorter, dd[dd.selectedIndex].value);
}

12
그럼에도 불구하고 설명에서 약간 오해의 소지가 있다고 생각합니다. 해도 this되고 결국 않습니다 undefined, 다음, 실제 문제는 단지 아닙니다 엄격한 모드 위반. 그들은 "엄격 모드"에 this있을 undefined때 경고를주는 것이 더 좋을 것 TypeError입니다.
user113716 2011 년

11
@ ripper234 실제로, 그것이 내가 항상 event.currentTarget대신 this.
Domenic

4
.jshintrc이 검사를 비활성화 하기 위해 어떤 구성 지시문을 추가 할 수 있습니까?
callum

7
@callum "validthis": true
Brett

18
사용 /* jshint validthis: true */당신은 단지 몇이 모든 경우를 변경하지 않으려면.
knownasilya

93

대문자로 시작하지 않는 함수에 대해이 메시지를 받았습니다.

"use strict";

// ---> strict violation
function something() {
    this.test = "";
}


// ---> just fine (note the capital S in Something)
function Something() {
    this.test = "";
}

28
jshint는 아마도 관례 상 Something대문자 S로 인한 생성자 라고 가정하고 있으므로을 사용하여 호출해야합니다 new. 그렇게하면 this`Something.prototype '을 기반으로하는 새로운 객체가되는 것을 정의 합니다. 가능한 엄격한 위반 경고를 제기하지 않는다는 가정 때문일 가능성이 큽니다.
Andy Merts 2015 년

4
AngularJS 공급자에서이 오류가 발생 했으므로 대문자 낙타 케이스 메서드 이름이 예상되고 소문자 낙타 케이스가 있습니다. 결정된.
Deminetix 2015 년

비슷한 문제가 있었는데, 함수 이름을 소문자로만 사용할 때 대문자를 사용하여 이름을 바꿨습니다.
GibboK

생성자이기도하므로 대문자 첫 글자를 사용하지 마십시오. 또 다른 문제에 직면하게됩니다. 대신 다음을 사용할 수 있습니다. var fnAbc = function () {this.test = ""}
Hieu Tran AGI

대문자는 함수의 내부 작동에 대해 아무것도 변경하지 않습니다. 프로그래머가 의미를 전달하기 위해 보통 이런 식으로하는 일입니다. 즉, 이것은 기술적 인 문제가 아니라 호만 간 소통의 하나입니다.
amenthes

9

표준 함수 선언을 사용하는 대신 함수를 변수로 선언하면 jshint는이를 엄격한 위반으로 표시하지 않습니다. 따라서 다음을 수행 할 수 있습니다.

var gotoPage = function (s){
    if(s<=this.d&&s>0){this.g=s; this.page((s-1)*this.p.size);}
};


var pageChange = function (event, sorter) {
    var dd = event.currentTarget;
    gotoPage.call(sorter, dd[dd.selectedIndex].value);
};

0

메서드를 구현하려는 경우 대신 프로토 타입에 할당 할 수 있습니다.

ExampleClassName.protytpe.gotoPage = function gotoPage(s){
  // code using this
};

JSHint는 함수가 할당 될 때 경고하지 않습니다.


아직 충분하지 않습니다. ClassName.prototype.myMethod = myMethod;, 그런 다음 아래 방법을 정의했습니다. myMethod가 올바르게 바인딩되어 있어도 여전히 오류가 발생합니다.
Jefftopia
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.