Не могу понять как передаются аргументы

165
17 июля 2018, 19:50

Изучаю javascript. Есть код

function delay(f, time){
  //alert(arguments);
  for(vs of arguments){
    alert(vs);
  }
  return function(){
      setTimeout(() => {
      f.apply(this, arguments);
  }, time);
  }
}
function f(x) {
  alert( x );
}
var f1000 = delay(f, 1000);
var f1500 = delay(f, 1500);
f1000("тест"); // выведет "тест" через 1000 миллисекунд
f1500("тест2"); // выведет "тест2" через 1500 миллисекунд

Не могу понять как аргументы функции f (в данном случае аргумент x, который принимает значения "тест" и "тест2") передаются в функцию delay и функция delay получает к ним доступ... Ведь arguments в функции delay содержат именно аргументы функции delay! А мы как по волшебству в функции delay получаем доступ к аргументам другой функции (в данном случае - к аргументам другой функции f).

Сделал перебор массива arguments, там как и ожидалось в первом элементе

function f(x) {
  alert( x );
}

во втором задержка 1000 или 1500

Как нам удается пробросить параметр x функции f в f.apply(this, arguments) не пониаю...

Answer 1

Тут главное - не использовать слово "пробросить".

Коллекции arguments в функции delay и в возвращаемой анонимной функции - это совершенно разные коллекции.

  ...
  return function(){
    setTimeout(() => {
      f.apply(this, arguments);
    }, time);
  }
}

Экземпляры этой возвращаемой анонимной функции присваиваются переменным f1000 и f1500.

Для f1000 - значение time равно 1000. Для f1500 - значение time равно 1500.

f в обоих случаях - внешняя функция f - первый параметр в вызовах delay.

У стрелочной функции, которая является первым параметром setTimeout, своих arguments нет, она использует arguments той функции, внутри которой она определена, то есть f1000 или f1500.

А аргументы этих f1000 и f1500 - "тест" и "тест2" соответственно.

READ ALSO
Как вызвать success callback

Как вызвать success callback

Я пишу метод save обьекта user который должен иметь в себе ивенты success и error (это ивенты?)

153
глобальная переменная

глобальная переменная

создаю глобальную переменную dev и локальную, внутри функции, почему ругается на "не определение" глобальной переменной? ведь если создам глобальную...

185
Изменить значение свойства left

Изменить значение свойства left

Прошу помочь с информацией по несложному вопросуЕсть разметка:

170
webpack установка модулей какой способ предпочтительнее?

webpack установка модулей какой способ предпочтительнее?

Можно ставить модули через две команды

243