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. 엄격 모드에서, this것 undefined, 당신은 곤경에 얻을 것입니다.

아마도 바운드 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.