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

时间:2012-08-21 14:44:54

标签: javascript jshint

考虑这个简单的代码:

"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有没有办法让我这样做?

5 个答案:

答案 0 :(得分:128)

如果不运行代码,很难检测到这种情况。您可以使用选项validthis来取消此警告:

"use strict";

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

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

需要注意的是,jshint注释是函数作用域。因此,注释将适用于函数g及其内部函数,而不仅仅是下一行。

答案 1 :(得分:7)

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

"use strict";

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

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

答案 2 :(得分:3)

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

"use strict";

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

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

jshint假设您遵循约定,以大写字母开头的函数是将被实例化并始终具有this的类。

答案 3 :(得分:1)

尝试:

Assets.absoluteFilePath(assetPath)

答案 4 :(得分: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();