JSHint "Возможное строгое нарушение". при использовании `bind`
Рассмотрим этот простой код:
"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
undefined в строгом режиме в функции.
Но я связываю эту функцию перед ее вызовом, поэтому this
- правильный объект.
Я использую этот "шаблон дизайна", чтобы избежать загромождения основного объекта. Передача свойств в параметрах также загромождает функцию, поэтому я отказываюсь это делать. Кроме того, это именно то, что bind
для.
Есть ли способ, чтобы JSHint позволил мне сделать это?
Ответы
Ответ 1
Чрезвычайно сложно обнаружить этот случай без запуска кода. Вы можете использовать опцию validthis
для подавления этого предупреждения:
"use strict";
var obj = {
f: function() {
this.prop = 'value';
g.bind( this )();
}
};
function g() {
/*jshint validthis:true */
console.log( this.prop );
}
Следует отметить, что комментарии jshint - это область действия. Таким образом, комментарий будет работать для функции g
и ее внутренних функций, а не только следующей строки.
Ответ 2
Вы также можете добиться того же эффекта, если вы измените код на следующее, чтобы избежать использования 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
.
Ответ 4
Try:
"use strict";
var obj = {
f: function() {
this.prop = 'value';
g.bind( this )();
}
};
var g = function() {
console.log( this.prop );
}
Ответ 5
Это другой "шаблон дизайна", как вы выразились, он достигает того же, но полностью избегает проблемы.
"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();