Как правильно получить доступ к внешнему объекту из внутреннего в JavaScript? Есть следующий код:function mock() {
this.val = 'val';
this.log = {
start: function() {
this.timer = setInterval(function() {
console.log(this.val);
}.bind(this), 1000);
}.bind(this),
stop: function() {
clearInterval(this.timer);
delete this.timer;
}.bind(this)
};
}
Впоследствии в строке console.log(this.val); предполагается доступ к внешнему объекту (то есть к mock). Сейчас я использовал bind(this) чтобы передать контекст во вложенные функции. Как правильно было бы написать подобное в парадигме JS так, чтобы в строке вида console.log(this.val) я мог получить нормальный доступ к внешнему (mock) объекту, и при этом чтобы интервал прикреплялся именно к вложенному объекту log(и был доступен через this в log'е) а не к mock? Насколько я понял тут либо надо передавать что-то через аргумент в start() либо каким-то образом сделать замыкание (но что именно замкнуть???). Но я все равно не понимаю, как бы это сделал человек который программирует на JS уже не один год и который умеет на этом языке думать) подскажите плз, javascript-ниндзи
ЗЫ.: Сам только перелез с пыхи на JS под Ноду. Не знаю насколько код выше выглядит адекватным, не судите строго

21 Авг 2019 в 07:02
224 +1
0
Ответы
1

В данном случае можно воспользоваться замыканием для сохранения доступа к внешнему объекту mock во вложенной функции. Вместо использования bind(this) можно сохранить ссылку на внешний объект перед использованием setInterval.

Пример кода с использованием замыкания:

function mock() {
var self = this;
this.val = 'val';
this.log = {
start: function() {
this.timer = setInterval(function() {
console.log(self.val);
}, 1000);
},
stop: function() {
clearInterval(this.timer);
delete this.timer;
}
};
}

В данном примере переменная self сохраняет доступ к внешнему объекту mock во вложенной функции. Теперь в строке console.log(self.val) будет выводиться значение свойства val объекта mock.

Надеюсь, это поможет вам разобраться с проблемой доступа к внешнему объекту из внутреннего в JavaScript. Если у вас есть еще вопросы, не стесняйтесь задавать.

20 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир