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 72

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();