Как правильно получить доступ к внешнему объекту из внутреннего в 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
204 +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 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 648 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир