Dlaczego JSHINT narzeka, że jest to ścisłe naruszenie?

Myślę, że może to być duplikat ścisłego naruszenia przy użyciu tego słowa kluczowego i ujawniania wzorca modułu

Mam ten kod:

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

A JSHINT (JSLINT) narzeka. "Ścisłe naruszenie."dla podświetlonej linii:

Tutaj wpisz opis obrazka

Czy moje użycie Function.call() i odwoływanie się do instancji jest w jakiś sposób niewłaściwe?

Czy jest to uważane za zły styl?
Author: Community, 2011-10-07

4 answers

JSHint mówi "możliwe ścisłe naruszenie", ponieważ używasz this wewnątrz czegoś, co, o ile może powiedzieć, nie jest metodą.

W trybie niestrudzonym wywołanie gotoPage(5) wiązałoby this z obiektem globalnym (window w przeglądarce). W trybie ścisłym, this będzie undefined, a Ty będziesz miał kłopoty.

Przypuszczalnie chodzi Ci o wywołanie tej funkcji z powiązanym kontekstem this, np. gotoPage.bind(myObj)(5) lub gotoPage.call(myObj, 5). Jeśli tak, możesz zignorować JSHint, ponieważ nie wygenerujesz żadnych błędów. Ale jest mówienie ci, że Twój kod jest niejasny dla każdego, kto go czyta, ponieważ używanie this wewnątrz czegoś, co nie jest oczywiście metodą, jest dość mylące. Lepiej byłoby po prostu przekazać obiekt jako parametr:

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);
}
 122
Author: Domenic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-07 14:53:06

Otrzymałem wiadomość dla funkcji, która nie zaczynała się wielką literą.

"use strict";

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


// ---> just fine (note the capital S in Something)
function Something() {
    this.test = "";
}
 93
Author: amenthes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-25 01:28:10

Jeśli zadeklarujesz funkcję jako zmienną zamiast używać standardowej deklaracji funkcji, jshint nie oznaczy tego jako ścisłe naruszenie. Możesz więc wykonać następujące czynności -

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);
};
 9
Author: asulaiman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-27 17:25:40

Jeśli próbujesz zaimplementować metodę, możesz zamiast tego przypisać do prototypu:

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

JSHint nie będzie ostrzegał, gdy funkcja jest przypisana.

 0
Author: Flimm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-14 16:16:35