【问题标题】:JSHint "Possible strict violation." when using `bind`JSHint “可能的严格违规。”使用“绑定”时
【发布时间】: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抱怨。

标签: javascript 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 这将禁用对整个代码库的检查。这是一种特殊情况,应该专门处理,而不是针对整个代码库。
      猜你喜欢
      • 2017-11-02
      • 2015-05-19
      • 2015-12-05
      • 2013-05-09
      • 2014-06-02
      • 2012-05-27
      • 2017-02-25
      相关资源
      最近更新 更多