これは このキーワードを使用してモジュールパターンを明らかにする厳格な違反 の複製であると思われます
私はこのコードを持っています:
_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()
を使用してからインスタンスを参照していますが、どういうわけか不適切ですか?
これは悪いスタイルと見なされますか?
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);
}
大文字で始まらない関数に対してこのメッセージが表示されました。
"use strict";
// ---> strict violation
function something() {
this.test = "";
}
// ---> just fine (note the capital S in Something)
function Something() {
this.test = "";
}
関数を標準の関数宣言を使用する代わりに変数として宣言する場合、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);
};
メソッドを実装しようとしている場合、代わりにプロトタイプに割り当てることができます。
ExampleClassName.protytpe.gotoPage = function gotoPage(s){
// code using this
};
JSHintは、関数が割り当てられているときに警告しません。