73

この単純なコードを考えてみましょう。

"use strict";

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

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

このコードを検証しようとすると、jshintPossible strict violation.で呼び出した場所でエラーが発生しますconsole.log( this.prop );。これはthis、関数の厳密モードではが未定義であるためです。

しかし、私はそれを呼び出す前にこの関数をバインドしているのでthis、正しいオブジェクトです。

この「デザインパターン」を使用して、メインオブジェクトが乱雑にならないようにしています。パラメータにプロパティを渡すと関数も乱雑になるので、これを行うことを拒否します。その上、これはまさにそのbind目的です。

JSHintにこれをさせる方法はありますか?

4

5 に答える 5

128

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

"use strict";

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

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

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

于 2012-08-21T17:03:57.857 に答える
7

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

"use strict";

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

function g(self) {
    console.log( self.prop );
}
于 2015-06-05T15:52:00.917 に答える
3

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

"use strict";

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

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

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

于 2015-11-10T14:51:57.720 に答える
1

試す:

"use strict";

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

var g = function() {
    console.log( this.prop );
}
于 2016-06-02T11:20:16.990 に答える
0

これは、あなたが言うと異なる「デザインパターン」であり、同じことを達成しますが、問題を完全に回避します。

"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();
于 2015-06-04T13:26:12.320 に答える