Подтвердить что ты не робот

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 позволил мне сделать это?

4b9b3361

Ответ 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();