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

이 키워드를 사용하고 모듈 패턴을 드러내는 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()인스턴스를 사용한 다음 참조하는 것이 부적절합니까?

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



답변

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


답변

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

"use strict";

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


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


답변

표준 함수 선언을 사용하는 대신 함수를 변수로 선언하면 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);
};


답변

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

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

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


답변