考虑这个简单的代码:
"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有没有办法让我这样做?
答案 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();