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

4

5 回答 5

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及其内部函数,而不仅仅是下一行。

于 2012-08-21T17:03:57.857 回答
7

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

"use strict";

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

function g(self) {
    console.log( self.prop );
}
于 2015-06-05T15:52:00.917 回答
3

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

"use strict";

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

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

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

于 2015-11-10T14:51:57.720 回答
1

尝试:

"use strict";

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

var g = function() {
    console.log( this.prop );
}
于 2016-06-02T11:20:16.990 回答
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();
于 2015-06-04T13:26:12.320 回答