JSHINTがこれが厳格な違反であると不平を言うのはなぜですか?


98

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

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

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()とインスタンスの参照は、どういうわけか不適切ですか?

これは悪いスタイルと考えられますか?


詳細なエラーメッセージは表示されず、「厳密な違反」とだけ表示されますか?
stivlo、2011年

問題を再現できません。JSHintとJSLintを介してコードを実行しましたが、何の問題もないようです。
Peter Olson、

54
ばかげたワンライナー:Pに詰め込もうとしないと、診断がはるかに簡単になることに注意してください。
Domenic

1
私はこれを別の質問で見ました(現在それを見つけることができません)。それはの使用に関係していますthis。JSLintがそれを厳密な違反と呼ぶ理由はわかりませんthisが、関数の値を定義しない場合undefined、厳密モードになることは知っています。明らかにを定義thisしているので、問題にはなりません。
user113716 2011年

2
あなたはこれらを無視することができます可能性厳格な違反をして"-W040":trueコンフィグJSONではなく、JSONはコメントがありませんので、それはそこには、理由は、あなたは誰にも言うことができません。
小次郎2013

回答:


124

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

12
それでも、説明では少し誤解を招いていると思います。場合でもthisなってしまうんundefinedし、実際の問題は、単にではありませんstrictモードの違反。彼らは、「ストリクトモード」のときに、(または何か)につながるthis可能性があることを警告する方が良いでしょう。undefinedTypeError
user113716 2011年

11
@ ripper234確かに、それが常にのevent.currentTarget代わりに使用する理由ですthis
Domenic

4
.jshintrcこのチェックを無効にするために、どのconfigディレクティブを追加できますか?
カラム14

7
@callum "validthis":true
Brett

18
使用して、/* jshint validthis: true */あなただけのカップルを持っており、すべてのケースのために変更したくない場合。
Knowasilya 2014

93

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

"use strict";

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


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

28
慣例により、jshintはおそらくSomething大文字のSによるコンストラクタであると想定しているため、を使用して呼び出す必要があることに注意しますnew。そうthisすることで、 `Something.prototype 'に基づく新しいオブジェクトであると定義されます。可能性のある厳格な違反警告を発生させないという想定が原因である可能性が高いです。
Andy Merts、2015年

4
AngularJSプロバイダーでこのエラーが発生したため、キャメルケースのメソッド名が予想され、キャメルケースが小文字でした。修繕。
Deminetix 2015年

同様の問題がありました。関数名を小文字のみにし、Capitalを使用して名前を変更した場合です。
GibboK 2015

大文字でもあるので、これもコンストラクタなので、大文字は使用しないでください。別の問題が発生します。代わりに、次を使用できます。var fnAbc = function(){this.test = ""}
Hieu Tran AGI

大文字は、関数の内部動作については何も変更しません。これは、プログラマーが意味を伝えるために通常この方法で行うものです。つまり、これは技術的な問題ではなく、人間同士のコミュニケーションの問題です。
amenthes 2017

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

0

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

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

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


まだ十分ではありません。ClassName.prototype.myMethod = myMethod;、次に以下のメソッドを定義しました。myMethodが正しくバインドされていても、エラーが発生します。
Jefftopia
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.