Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
2 / 2 / 1
Регистрация: 16.12.2013
Сообщений: 73

Вызов в анонимной функции

29.05.2017, 09:03. Показов 1328. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста почему _render вызывается внутри анонимной функции в setInterval?
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function Clock(options) {
  this._template = options.template;
}
 
Clock.prototype._render = function render() {
  var date = new Date();
 
  var hours = date.getHours();
  if (hours < 10) hours = '0' + hours;
 
  var min = date.getMinutes();
  if (min < 10) min = '0' + min;
 
  var sec = date.getSeconds();
  if (sec < 10) sec = '0' + sec;
 
  var output = this._template.replace('h', hours).replace('m', min).replace('s', sec);
 
  console.log(output);
};
 
Clock.prototype.stop = function() {
  clearInterval(this._timer);
};
 
Clock.prototype.start = function() {
  this._render();
  var self = this;
  this._timer = setInterval(function() {
    self._render();
  }, 1000);
};
Добавлено через 24 минуты
и теперь ещё вопрос появился, функции записанный в прототип считают this прототип, или будущий объект, в данном случаи clock.

Добавлено через 9 минут
Как я понял если метод не найден в своем контексте, он ищется в прототипе, и из прототипа вызывается в конексте объекта, но как тогда функция start находит _render?

Добавлено через 8 минут
а не, последние два вопроса отпадают, но первый никак понять не могу.

Добавлено через 10 часов 31 минуту
Потому что в вызове без анонимной функции вызов бы уже запланировался, а контекст ещё не был бы определен?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.05.2017, 09:03
Ответы с готовыми решениями:

Запуск анонимной функции
Hi all! Что можно сделать если есть функция $(window).load(function(){//тут какая-то логика я работаю с аяксом и мне...

Область видимости в анонимной функции
for (var i = 0; i &lt; players_array.length; /* Пускай players_array.length будет равно 2*/ i++) { //Вывод числа итераций ...

Присвоение анонимной функции двум переменным
Приветствую! Вопрос связан с оптимизацией использования ОЗУ. Есть строка:var1 = var2 = function() {}В результате выполнения этой строки...

9
Эксперт JS
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
29.05.2017, 09:18
Цитата Сообщение от execto Посмотреть сообщение
почему _render вызывается внутри анонимной функции в setInterval?
Потому что вы так написали.
Функция setInterval() принимает в качестве первого параметра функцию. Соответственно у вас 2 варианта написания:
JavaScript
1
2
3
this._timer = setInterval(function() {
  self._render();
}, 1000);
или
JavaScript
1
this._timer = setInterval(self._render, 1000);
В первом случае вы передаёте анонимную функцию, в теле которой исполняется метод класса Clock. Во втором случае вы передаёте сам метод класса Clock, который является функцией. Большой разницы тут нет.
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
29.05.2017, 09:22
Цитата Сообщение от execto Посмотреть сообщение
Потому что в вызове без анонимной функции вызов бы уже запланировался, а контекст ещё не был бы определен?
Потому что если вы сделаете так:
JavaScript
1
this._timer = setInterval(self._render, 1000);
то метод _render() будет выполнятся в контексте Window, следовательно там не будут доступны методы и свойства объекта Clock. Вы можете сами проверить:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function Clock(options) {
  // this._template = options.template;
}
 
Clock.prototype._render = function render() {
  console.log(this);
};
 
Clock.prototype.stop = function() {
  clearInterval(this._timer);
};
 
Clock.prototype.start = function() {
  this._render();
  var self = this;
  this._timer = setInterval(self._render, 1000);
};
 
new Clock().start();
В таком виде первый вызов this будет экземпляр Clock, а вот все дальнейшие будет Window.
3
Эксперт JS
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
29.05.2017, 09:25
Да. Разница действительно есть. Моя невнимательность...
0
2 / 2 / 1
Регистрация: 16.12.2013
Сообщений: 73
29.05.2017, 09:35  [ТС]
Так в self же записывается ссылка на контекст? и при создании нового объекта this получит ссылку на объект?
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
29.05.2017, 10:06
Цитата Сообщение от execto Посмотреть сообщение
и при создании нового объекта this получит ссылку на объект?
JavaScript
1
2
3
4
5
Clock.prototype.start = function() {
  this._render();
  var self = this;
  this._timer = setInterval(self._render, 1000);
};
Что здесь проиходит? Грубо говоря, мы Window определяем новый метод, который будет выполнятся каждую секунду => в методе _render this уже будет не экземпляр Clock.

Вот подумайте пока над примером попроще
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var vasia = {
  name: 'Vasia',
  say: function() {
    var self = this;
    setTimeout(function() {
      // что произойдет, если `self` ниже заменить на `this`?
      console.log(self.name);
    }, 500);
  },
  sayES6: () => {
    let self = this;
    setTimeout(() => console.log(self.name), 1000);
  }
}
 
var petia = {
  name: 'Petia'
}
 
// здесь начинается магия
petia.say = vasia.say;
petia.sayES6 = vasia.sayES6;
 
petia.say(); // что выведет в консоль?
petia.sayES6(); // а здесь?
0
2 / 2 / 1
Регистрация: 16.12.2013
Сообщений: 73
29.05.2017, 14:13  [ТС]
Ну до ES6 и let я пока не дошел, но в остальном, если я правильно усвоил предыдущие главы:
1) если self заменить на this, то контекст потеряется, так как его "перекроет" setInterval
2) petia.say() выведет Petia, так как из объекта скопировался только метод, а не контекст.

Добавлено через 6 минут
Я наверно не понимаю в какой момент прототипным функциям присваивается this. То есть когда мы создаем объект, в this объекта хранятся только напрямую заданные свойства, типа _template, а прототипы получают в this ссылку на window, и когда мы вызываем без анонимной функции то в self._render у нас уже лежит window, и не меняется, а когда через анонимную то туда записывается текущий контекст?
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
29.05.2017, 19:16
Цитата Сообщение от execto Посмотреть сообщение
Я наверно не понимаю в какой момент прототипным функциям присваивается this.
Короткий ответ: ни в какой момент.

Помните, что JS - интерпретируемый язык. this всегда будет зависить от контекста выполнения. Простыми словами this - это объект, на котором вызвали метод (тот, который идет перед . в вызове).
0
2 / 2 / 1
Регистрация: 16.12.2013
Сообщений: 73
29.05.2017, 20:17  [ТС]
Ну так я так и думал с самого начала, но вот этот вызов меня запутал совсем. я не могу понять почему в self записывается window, если мы вызываем start в контексте нового объекта. ведь поиск будет таким obj -> Clock.prototype, и все методы из прототипа будут вызываться в контексте obj, или я всё таки неправильно рассуждаю.

Добавлено через 17 минут
какую тему нужно перечитать чтоб понять это?
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
30.05.2017, 09:24
execto, конкретно этот случай: http://learn.javascript.ru/bin... 1%82%D0%B0

И так, для общего развития:
http://learn.javascript.ru/object-methods
http://learn.javascript.ru/call-apply
http://learn.javascript.ru/event-delegation
http://learn.javascript.ru/functional-inheritance
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.05.2017, 09:24
Помогаю со студенческими работами здесь

Вернуть значение локальной переменной анонимной функции
Как получить значение x, не делая его глобальной переменной (не менять место его объявления) ? elem.onclick = function() { var...

Два и совершенно разных определения анонимной функции
На просторах интернета встретил два определения анонимной функций: Первое определение: Функциональное выражение, которое не...

Синтаксис анонимной функции, которая содержит весь код
Привет всем. Прочитал, что код вставляют в тело анонимной функции, вот такой: ( function() { // код } () ); правда без...

Вернуть значение с анонимной функции
Всем привет, вот только недавно начал изучать JS, начал писать небольшой сайт с использованием jQuery. Проблема состоит в том, что я не...

Вызов функции из другой функции после нажатия на кнопку
Помогите, пожалуйста! Никак не могу понять почему не запускается функция d() Полный код: &lt;script language=&quot;javascript&quot;&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru