web-dev-qa-db-ja.com

JSHint「可能性のある厳格な違反。」 `bind`を使用する場合

次の簡単なコードを検討してください。

_"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でこれを可能にする方法はありますか?

73

コードを実行せずにこのケースを検出することは非常に困難です。オプションvalidthisを使用して、この警告を抑制することができます。

"use strict";

var obj = {
    f: function() {
        this.prop = 'value';
        g.bind( this )();
    }
};

function g() {
    /*jshint validthis:true */
    console.log( this.prop );
}

Jshintコメントは関数スコープであることに注意してください。したがって、コメントは次の行だけでなく、関数gとその内部関数に対しても機能します。

128
Anton Kovalyov

thisを一緒に使用しないようにコードを次のように変更しても、同じ効果を得ることができます。

"use strict";

var obj = {
    f: function() {
        this.prop = 'value';
        g.bind( null, this )();
    }
};

function g(self) {
    console.log( self.prop );
}
7
George

パターンの変更やjshintの特定のマークアップを必要としない、より簡単なソリューションを次に示します。

"use strict";

var obj = {
    f: function() {
        this.prop = 'value';
        G.bind( this )();
    }
};

function G() {
    console.log( this.prop );
}

jshintは、大文字で始まる関数はインスタンス化され、常にthisが使用可能なクラスであるという規則に従っていると想定しています。

3
xgrtl

試してください:

"use strict";

var obj = {
    f: function() {
        this.prop = 'value';
        g.bind( this )();
    }
};

var g = function() {
    console.log( this.prop );
}
1
Michał Wojas

これは、「設計パターン」とは異なるものであり、同じことを達成しますが、問題を完全に回避します。

"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();
0
George