Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 29.01.2021, 22:25
Аспирант
Отправить личное сообщение для denis_alekss Посмотреть профиль Найти все сообщения от denis_alekss
 
Регистрация: 01.12.2020
Сообщений: 55

Ничего не менял, запустил ваш код, функция foo не определена выдает, вот фото ниже, сделал скриншот
Изображения:
Тип файла: jpg Снимок.JPG (115.7 Кб, 3 просмотров)
Ответить с цитированием
  #12 (permalink)  
Старый 29.01.2021, 22:40
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

Сообщение от denis_alekss
запустил ваш код,
а зачем? вы что-то добавили, изменили? зачем запускать то, что является условием задачи, а не её решением?
Ответить с цитированием
  #13 (permalink)  
Старый 29.01.2021, 22:58
Аспирант
Отправить личное сообщение для denis_alekss Посмотреть профиль Найти все сообщения от denis_alekss
 
Регистрация: 01.12.2020
Сообщений: 55

Если для теста написать даже вот так:
var foo = (function() {
   /*var numberOfCalls = 0;*/
  
  alert('Привет');
 return  function () {
	   return alert('Пока');
   }
})();


Вначале простреляет 1 Привет, а затем 3 пока, и каждый раз когда будет выводится слово Пока, будет выводится в консоль undefined, значит переменная foo ссылается только на внутренню анонимную функцию ?

НА эту если возвратимся к коду в 1-ом посте:

return function() {
      return ++ numberOfCalls;
   }
Ответить с цитированием
  #14 (permalink)  
Старый 29.01.2021, 22:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

denis_alekss,
надо дописать в пару мест недостающее, что-бы код стал рабочим.
var foo = (function() {
   return function() {
      return ++ numberOfCalls;
   }
})();
Ответить с цитированием
  #15 (permalink)  
Старый 29.01.2021, 23:09
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

denis_alekss,
ок ... что-то пошло не так, наверно я плохо сформулировал задачу...

var foo = (function(numberOfCalls) {
   return function() {
      return ++numberOfCalls;
   }
})(0);

console.log(foo());//1
console.log(foo());//2
console.log(foo());//3
Ответить с цитированием
  #16 (permalink)  
Старый 29.01.2021, 23:14
Аспирант
Отправить личное сообщение для denis_alekss Посмотреть профиль Найти все сообщения от denis_alekss
 
Регистрация: 01.12.2020
Сообщений: 55

Этим кодом вы показываете что ссылка все-таки идет на внутреннюю функцию, вы просто передаете аргумент 0 функции fn, а им пользуется внутренняя анонимная функция. Если передать вместо 0 передать к примеру 8, счетчик пойдет с 9 из-за инкремента и вся работа пойдет во внутренней а не со внешней функции
Ответить с цитированием
  #17 (permalink)  
Старый 29.01.2021, 23:27
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

denis_alekss,
Ответить с цитированием
  #18 (permalink)  
Старый 29.01.2021, 23:45
Аспирант
Отправить личное сообщение для denis_alekss Посмотреть профиль Найти все сообщения от denis_alekss
 
Регистрация: 01.12.2020
Сообщений: 55

Немного другая версия этого же случая:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <script>
Function.prototype.bind = function(context) {
   var fn = this;
   return function() {
      return fn.apply(context, arguments);
   };
}
var HelloPage = {
   name: 'Вася!!!',
   init: function() {
      alert('Hello, ' + this.name);
   }
}
window.onload = HelloPage.init.bind(HelloPage); 
</body>
</html>


Если поменять эту строку:
Function.prototype.bind

на
Function.prototype.call

разницы при выводе не происходит.

Если поменять эту строку:
window.onload = HelloPage.init.bind(HelloPage);

на
window.onload = HelloPage.init.apply(HelloPage);

Также вывод одинаковый.

В этом месте также используется замыкание
Function.prototype.call = function(context) {
   return function() {
      return this.apply(context, arguments);
   };
}

Здесь this ссылается на объект HelloPage благодаря функции call или bind если указать в строке Function.prototype.bind? Можно ли обойтись в этом коде для получения идентичного результата без замыканий если я хочу вызвать метод объекта передав свойство Петя с этого же объекта в метод?

Последний раз редактировалось denis_alekss, 29.01.2021 в 23:55.
Ответить с цитированием
  #19 (permalink)  
Старый 30.01.2021, 04:11
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 498

Сообщение от denis_alekss
А описанная внутренняя анонимная функция в функции fn разве не замыкание?
Замыкание, но оно не имеет отношения к IIFE.

Можно определить замыкание и без IIFE, просто внешнюю функцию надо будет вызвать явно:
<body>
<script>
function getMyClosure(){
   var count = 0;
   var closure = function(){ return count++; }
   return closure;
}

var counter = getMyClosure(); //вызываем явно и сохраняем ссылку на внутреннюю функцию в нашей переменной
</script>
<button onclick="alert(counter())">Press Me</button>
</body>

Последний раз редактировалось Белый шум, 30.01.2021 в 04:54.
Ответить с цитированием
  #20 (permalink)  
Старый 31.01.2021, 18:58
Аспирант
Отправить личное сообщение для denis_alekss Посмотреть профиль Найти все сообщения от denis_alekss
 
Регистрация: 01.12.2020
Сообщений: 55

Цитата:
var counter = getMyClosure(); //вызываем явно и сохраняем ссылку на внутреннюю функцию в нашей переменной
Зачем нужно создавать ссылку counter на функцию getMyClosure?
Почему нельзя просто вызвать getMyClosure() и передать в Onclick?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
замыкания в javascript Smike Общие вопросы Javascript 11 01.10.2014 00:15
Книга: JavaScript. Сильные стороны Magneto Учебные материалы 16 21.04.2013 15:28
Интерпретатор Java на JS kobezzza Оффтопик 24 11.10.2012 18:32
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34