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 “可能的严格违规。”使用“绑定”时的主要内容,如果未能解决你的问题,请参考以下文章

d3.js on event + jshint 可能严格违反

第一次安装jshint,jshint新手使用记录

JSHint 是不是支持异步/等待?

前端自动化工具 grunt 插件 jshint 的简单使用

如何在 Atom 中为 jshint 禁用“使用严格”

sublime2使用jshint