web-dev-qa-db-ja.com

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()を使用してからインスタンスを参照していますが、どういうわけか不適切ですか?

これは悪いスタイルと見なされますか?

97
Cheeso

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

大文字で始まらない関数に対してこのメ​​ッセージが表示されました。

"use strict";

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


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

関数を標準の関数宣言を使用する代わりに変数として宣言する場合、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);
};
9
asulaiman

メソッドを実装しようとしている場合、代わりにプロトタイプに割り当てることができます。

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

JSHintは、関数が割り当てられているときに警告しません。

0
Flimm