Почему JSHINT жалуется, что это строгое нарушение? - PullRequest
97 голосов
/ 07 октября 2011

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

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

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

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

Ответы [ 4 ]

124 голосов
/ 07 октября 2011

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);
}
93 голосов
/ 25 ноября 2014

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

"use strict";

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


// ---> just fine (note the capital S in Something)
function Something() {
    this.test = "";
}
9 голосов
/ 27 апреля 2015

Если вы объявите функцию как переменную вместо стандартного объявления функции, 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 голосов
/ 14 августа 2015

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

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

JSHint не предупредит при назначении функции.

...