Почему 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) жалуется. В нем говорится "Строгое нарушение". для выделенной строки:

enter image description here

Я использую Function.call(), а затем ссылаюсь на экземпляр, как-то неуместно?

Считается, что это плохой стиль?

Ответ 1

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

Ответ 2

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

"use strict";

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


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

Ответ 3

Если вы объявите функцию как переменную вместо использования объявления стандартной функции, 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);
};

Ответ 4

Если вы пытаетесь внедрить метод, вместо этого вы можете назначить прототип:

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

JSHint не будет предупреждать, когда функция назначается.