пару вопросов по решению к задаче [дубликат]

101
21 сентября 2019, 22:40

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

  • Потеря контекста вызова 5 ответов

По заданию: Добавьте всем функциям в прототип метод defer(ms), который возвращает обёртку, откладывающую вызов функции на ms миллисекунд. Понятно,только то что строка 3 привязывает контекст и аргументы к возвращаемой обёртке, которые берутся из замыкания

Непонятно почему в коде this сохраняется дважды? В строке (1) сохраняется задерживаемая функция, но почему тогда строку с аргументами context(2) перенесли в возвращаемою функцию? Почему не объявили эту переменную перед return?При этом во второй строке контекст вроде как равен underfined

Function.prototype.defer = function(ms) { 
  var f = this; // (1) 
  return function() { 
    var args = arguments, 
      context = this;  // (2) 
    setTimeout(function() { 
      f.apply(context, args); // (3) 
    }, ms); 
  } 
} 
 
// проверка 
function f(a, b) { 
  alert( a + b ); 
} 
 
f.defer(1000)(1, 2);

Answer 1

Потому что параметры для суммирующей функции function f(a, b) появляются только во втором вызове. То есть в вызове анонимной функции, возвращенной из defer.

Контекст во втором вызове, сохраненный в context, - это window.

READ ALSO
“Route.post() requires a callback function but got a Object” при использовании multer

“Route.post() requires a callback function but got a Object” при использовании multer

При вызове маршрута: routerpost('/', upload, controller

108
Как получить дату в ISO формате?

Как получить дату в ISO формате?

Подскажите, как переформанировать дату публикации получаемую с сервера в ISO формат

67
javascript кнопка звука

javascript кнопка звука

создаю игру на Canvas/JavascriptЕсть кнопка звука при клике должен меняться иконка звука (вкл \ выкл)

95
Как принудительно открыть autocomplete?

Как принудительно открыть autocomplete?

Использую Quasar Framework, конкретно проблема с компонентом Autocomplete:

102