Почему JSHINT жалуется, что это строгое нарушение?


Я думаю, что это может быть дубликат строгого нарушения с использованием этого ключевого слова и выявления шаблона модуля

у меня есть этот код:

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() а потом ссылаться на экземпляр, как-то неуместно?

это считается плохим стилем?

4 96

4 ответа:

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

У меня было это сообщение для функции, которая не начиналась с заглавной буквы.

"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 не будет предупреждать, когда функция назначается.