当使用`bind`的时候,JSHint“可能严格违规”

考虑这个简单的代码:

"use strict"; var obj = { f: function() { this.prop = 'value'; g.bind( this )(); } }; function g() { console.log( this.prop ); } 

如果我试图validation这个代码,jshint给我错误Possible strict violation. 我打电话给console.log( this.prop ); 。 这是因为在函数的严格模式下this是未定义的。

但是我在调​​用它之前绑定了这个函数,所以this是正确的对象。

我正在使用这种“devise模式”来避免混淆主要对象。 传递参数中的属性也会使函数混乱,所以我拒绝这样做。 此外,这正是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注释是function范围的。 所以这个注释可以用于函数g和它的内部函数,而不仅仅是下一行。

如果您将代码修改为以下内容以避免一起使用,也可以达到相同的效果。

 "use strict"; var obj = { f: function() { this.prop = 'value'; g.bind( null, this )(); } }; function g(self) { console.log( self.prop ); } 

这是一个更简单的解决scheme,不需要对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 ); } 

这是一个不同的“devise模式”,它可以达到同样的效果,但完全避免了这个问题。

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