100

これは、このキーワードを使用し、モジュールパターンを明らかにするStrictViolationの複製である可能性があると思います

私はこのコードを持っています:

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

4 に答える 4

125

JSHintは、「厳密な違反の可能性がある」と言っています。これは、私がthis知る限り、メソッドではないものの内部で使用しているためです。

非厳密モードでは、呼び出しは(ブラウザー内の)グローバルオブジェクトにgotoPage(5)バインドされます。厳密モードでは、になり、問題が発生します。thiswindowthisundefined

おそらく、この関数をバインドされた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);
}
于 2011-10-07T14:45:29.810 に答える
94

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

"use strict";

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


// ---> just fine (note the capital S in Something)
function Something() {
    this.test = "";
}
于 2014-11-25T01:28:10.413 に答える
9

標準の関数宣言を使用する代わりに関数を変数として宣言した場合、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);
};
于 2015-04-27T17:25:40.400 に答える
0

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

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

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

于 2015-08-14T16:16:35.487 に答える