JSHint “可能的严格违规。”使用“绑定”时
Posted
技术标签:
【中文标题】JSHint “可能的严格违规。”使用“绑定”时【英文标题】:JSHint "Possible strict violation." when using `bind` 【发布时间】:2012-08-16 22:48:06 【问题描述】:考虑这个简单的代码:
"use strict";
var obj =
f: function()
this.prop = 'value';
g.bind( this )();
;
function g()
console.log( this.prop );
如果我尝试验证此代码,jshint 会给我错误Possible strict violation.
,我在其中调用console.log( this.prop );
。这是因为 this
在严格模式下未定义在函数中。
但是我在调用它之前绑定了这个函数,所以this
是正确的对象。
我使用这种“设计模式”来避免主对象混乱。在参数中传递属性也会使函数变得混乱,所以我拒绝这样做。此外,这正是bind
的用途。
JSHint 有办法让我这样做吗?
【问题讨论】:
这可能是 jshint 中的错误吗? 好吧,这可能是严格的违规行为,这是正确的。但是,如果它无法解析bind
问题,我认为它应该仍然是警告,而不是错误。不知道...
但是就像你提到的那样;这不是错误因为你在调用它之前first绑定了它。让它发出警告可能也没有太大帮助,因为这是 .bind()
的预期目的
是的...我已经在 jshint 队列中打开了this issue,但也许有一种配置方法可以改变它?这就是我问这个问题的原因:如果可能的话,找到一个解决方法(不要太丑陋)。
“这正是bind
的用途” - 好吧,在这里,我猜你可能只想做g.call(this)
。 (但不确定它是否能解决问题。)如果你想默认绑定g
,你可以改为var g = function() .bind(obj)
,这会阻止jshint抱怨。
【参考方案1】:
试试:
"use strict";
var obj =
f: function()
this.prop = 'value';
g.bind( this )();
;
var g = function()
console.log( this.prop );
【讨论】:
【参考方案2】:这是一个更简单的解决方案,不需要对 jshint 的模式或特定标记进行任何更改:
"use strict";
var obj =
f: function()
this.prop = 'value';
G.bind( this )();
;
function G()
console.log( this.prop );
jshint 假定您遵循以下约定:以大写字母开头的函数是类,它们将被实例化并且始终具有 this
可用。
【讨论】:
我认为这会引起相当大的代码异味。你只是在使用 jshint 的一个不相关的功能来欺骗它。【参考方案3】:如果您将代码修改为以下内容以避免将this
一起使用,您也可以达到相同的效果。
"use strict";
var obj =
f: function()
this.prop = 'value';
g.bind( null, this )();
;
function g(self)
console.log( self.prop );
【讨论】:
【参考方案4】:正如你所说,这是一种不同的“设计模式”,它实现了同样的事情,但完全避免了这个问题。
"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();
【讨论】:
我在我的问题中说我想避免这种模式:) 这种模式只有在你的所有脚本都在一个文件中时才会变得混乱,你可以使用诸如 require.js 之类的库来模块化你的代码。 谢谢,我知道require.js、webpack、browserify等。不过这不是这个问题的问题。 +1。此答案可能无法回答 OP 的原始问题,但对于遇到“可能严格违反”错误的其他人很有用。【参考方案5】:如果不运行代码,很难检测到这种情况。您可以使用选项validthis
来抑制此警告:
"use strict";
var obj =
f: function()
this.prop = 'value';
g.bind( this )();
;
function g()
/*jshint validthis:true */
console.log( this.prop );
需要注意的是 jshint cmets 是函数作用域的。所以注释将适用于函数g
及其内部函数,而不仅仅是下一行。
【讨论】:
我是否必须在使用this
的每一行之前添加此注释?
不,JSHint 中的选项是函数范围的。因此,此注释将在函数 g
及其内部函数(如果有)中起作用。
但愚蠢的是它不是潜在的严格模式违规。声明不带 var 关键字的 var 将违反严格模式。这只是对尝试访问未定义属性可能导致的错误的错误警告。这是一个潜在的与严格模式相关的问题,但该问题与实际违反严格模式规则无关。
或将 "validthis": true 添加到您的 .jshintrc
@Raine 这将禁用对整个代码库的检查。这是一种特殊情况,应该专门处理,而不是针对整个代码库。以上是关于JSHint “可能的严格违规。”使用“绑定”时的主要内容,如果未能解决你的问题,请参考以下文章