次の簡単なコードを検討してください。
_"use strict";
var obj = {
f: function() {
this.prop = 'value';
g.bind( this )();
}
};
function g() {
console.log( this.prop );
}
_
このコードを検証しようとすると、jshintはconsole.log( this.prop );
を呼び出すエラー_Possible strict violation.
_を返します。これは、関数のストリクトモードではthis
が未定義だからです。
しかし、この関数を呼び出す前にバインドしているので、this
が正しいオブジェクトです。
この「デザインパターン」を使用して、メインオブジェクトが乱雑にならないようにします。パラメータでプロパティを渡すと、関数が乱雑になるため、これを拒否します。さらに、これはまさにbind
の目的です。
JSHintでこれを可能にする方法はありますか?
コードを実行せずにこのケースを検出することは非常に困難です。オプションvalidthis
を使用して、この警告を抑制することができます。
"use strict";
var obj = {
f: function() {
this.prop = 'value';
g.bind( this )();
}
};
function g() {
/*jshint validthis:true */
console.log( this.prop );
}
Jshintコメントは関数スコープであることに注意してください。したがって、コメントは次の行だけでなく、関数g
とその内部関数に対しても機能します。
this
を一緒に使用しないようにコードを次のように変更しても、同じ効果を得ることができます。
"use strict";
var obj = {
f: function() {
this.prop = 'value';
g.bind( null, this )();
}
};
function g(self) {
console.log( self.prop );
}
パターンの変更やjshintの特定のマークアップを必要としない、より簡単なソリューションを次に示します。
"use strict";
var obj = {
f: function() {
this.prop = 'value';
G.bind( this )();
}
};
function G() {
console.log( this.prop );
}
jshintは、大文字で始まる関数はインスタンス化され、常にthis
が使用可能なクラスであるという規則に従っていると想定しています。
試してください:
"use strict";
var obj = {
f: function() {
this.prop = 'value';
g.bind( this )();
}
};
var g = function() {
console.log( this.prop );
}
これは、「設計パターン」とは異なるものであり、同じことを達成しますが、問題を完全に回避します。
"use strict";
function obj() {
this.prop = '';
}
obj.prototype.f = function obj_f() {
this.prop = 'value';
this.g();
};
obj.prototype.g = function obj_g() {
console.log( this.prop );
};
次のように呼び出します:
var myO = new obj();
myO.f();