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

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

29.05.2017, 09:03. Показов 1274. Ответов 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru