当使用`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();