Задача с областью видимости JS [дубликат]

243
23 августа 2017, 19:39

На данный вопрос уже ответили:

  • Возврат функции из функции - как работает замыкание? 3 ответа
function t(){
}

let counter = t;
console.log(counter()); //1
console.log(counter()); //2
console.log(counter()); //3
console.log(counter()); //4
console.log(counter()); //5

Задача: Описать финкцию t , что бы при каждом вызове console.log() выводилось соответствующее значение после коментария. Для первого вызова - 1 , для 5ого - 5. Без использования глобальных переменных!! Весь код должен лежать в функции.

Мне кажется, всё дело в области видимости. Но я в этом не уверен и не знаю с чего мне начать. Укажите пожалуйста направление для мыслей! Спасибо

Answer 1

Простой пример замыкания. И да, вместо t, должно быть t() по логике условия.

function t() { 
  var i = 0; 
  return function() { 
    return ++i; 
  };  
} 
 
var counter = t(); 
 
console.log(counter()); //1  
console.log(counter()); //2  
console.log(counter()); //3  
console.log(counter()); //4  
console.log(counter()); //5 

Answer 2

Ну раз уж ответ с тем, что нужно, запостили, запощу и ответ с тем, что НЕ нужно, зато полностью соответствует условию из вопроса:

function t() { 
  var x = 1; 
  counter = () => ++x; 
  return x; 
} 
 
let counter = t; 
 
console.log(counter()); //1 
console.log(counter()); //2 
console.log(counter()); //3 
console.log(counter()); //4 
console.log(counter()); //5

Answer 3

Справедливости ради, стоит заметить что задачу можно решить и одной функцией.

function t() { 
   if (typeof t._counter !== 'number') { 
      t._counter = 0 
   } 
 
   return ++t._counter 
} 
 
const counter = t 
 
console.log(counter())  // 1 
console.log(counter())  // 2 
console.log(counter())  // 3 
console.log(counter())  // 4 
console.log(counter())  // 5

Answer 4

Варианта с генератором еще нету?

const g = (function* (i){ 
    while(true) yield i++; 
})(1); 
 
function t(){ 
    return g.next().value; 
} 
 
let counter = t; 
 
console.log(counter()); //1 
console.log(counter()); //2 
console.log(counter()); //3 
console.log(counter()); //4 
console.log(counter()); //5

READ ALSO
Регулярка для JSLint

Регулярка для JSLint

Очередная беда с регуляркой, нужно извлечь всю строку между

199
Нужен совет опытных веб разработчиков [требует правки]

Нужен совет опытных веб разработчиков [требует правки]

Здравствуйте, изучил основы javascript, html, cssДалее попал в тупик так как что то сложное сделать у меня не получается, а как продолжать обучение...

316