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