JSHint“可能严格违反。” 当使用`bind`时


73

考虑以下简单代码:

"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中的错误吗?
rlemon

1
好吧,事实上这是可能的严格违反。但是,如果它不能解析bind问题,我认为它应该是警告而不是错误。
Dunno

1
但是就像你提到的那样;这是不是一个错误,因为你已绑定它首先调用它。发出警告可能也没有太大帮助,因为这是.bind()
–rlemon

是的...我已经在jshint队列中打开了这个问题,但是也许有一种配置方法可以更改此问题?这就是为什么我问这个问题:找到可行的解决方法(不太丑陋)。
Florian Margaine

“这正是bind目的”-好吧g.call(this),我想您可能想要这样做。(不过,不确定是否能解决问题。)如果g默认情况下要绑定,则可以这样做var g = function() { }.bind(obj),这会阻止jshint发出抱怨。
pimvdb

Answers:


128

不运行代码就很难检测到这种情况。您可以使用optionvalidthis禁止显示此警告:

"use strict";

var obj = {
    f: function() {
        this.prop = 'value';
        g.bind( this )();
    }
};

function g() {
    /*jshint validthis:true */
    console.log( this.prop );
}

要注意的是,jshint注释是函数范围的。因此,注释将对函数g及其内部函数起作用,而不仅仅是下一行。


我必须在使用的每一行之前添加此注释this吗?
Florian Margaine

1
不,JSHint中的选项是函数范围的。因此,此注释将在函数g及其内部函数(如果有)中起作用。
安东·科瓦廖夫

9
但是愚蠢的是,这不是潜在的严格模式违规。声明不带var关键字的var将严格违反模式。这只是针对尝试访问未定义属性可能导致的错误的错误警告。这是一个潜在的与严格模式有关的问题,但该问题与实际违反严格模式规则无关。
埃里克·雷彭

11
或在您的.jshintrc中添加validthis ”:true
Raine Revere

7
@Raine这将禁用整个代码库的检查。这是一种特殊情况,应该专门处理,而不是针对整个代码库。
Florian Margaine 2014年

7

如果将代码修改为以下内容,以避免同时使用this所有代码,则也可以达到相同的效果。

"use strict";

var obj = {
    f: function() {
        this.prop = 'value';
        g.bind( null, this )();
    }
};

function g(self) {
    console.log( self.prop );
}

3

这是一个更简单的解决方案,不需要为jshint更改任何模式或特定标记:

"use strict";

var obj = {
    f: function() {
        this.prop = 'value';
        G.bind( this )();
    }
};

function G() {
    console.log( this.prop );
}

jshint假定您遵循以下约定:以大写字母开头的函数是将被实例化并始终this可用的类。


2
我认为这会引起相当大的代码异味。您只是使用jshint的无关功能来欺骗它。
2016年

1

尝试:

"use strict";

var obj = {
    f: function() {
        this.prop = 'value';
        g.bind( this )();
    }
};

var g = function() {
    console.log( this.prop );
}

0

正如您所说的,这是一种不同的“设计模式”,它可以实现相同的目的,但可以完全避免问题。

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

我在问题中说,我想避免这种模式:)
Florian Margaine 2015年

如果您所有的脚本都在一个文件中,则这种模式只会很混乱,您可以使用require.js之类的库对代码进行模块化。
乔治

谢谢,我知道require.js,webpack,browserify等。这不是这个问题的问题。
Florian Margaine 2015年

+1。此答案可能无法回答OP的原始问题,但对于其他人有“可能的严格违反”错误的问题很有用。
Necreaux
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.