Javascript привязывает вызов

#javascript

#javascript

Вопрос:

Я наткнулся на следующий код. Пытаюсь понять, что именно он делает. Похоже, что файл скрипта намеренно запутан.

 var d=Function.prototype.bind,
e=Function.prototype.call,
f=e.bind(d,e),
  

какие виды преобразуются в

 var f = Function.prototype.call.bind(Function.prototype.bind, Function.prototype.call)
  

Просматривая документацию MDN, bind принимает дополнительные параметры, передаваемые функции. Означает ли это, что всякий раз, когда используется переменная f , она будет получать Function.prototype.call в качестве первого параметра? Как помогает установка «this» в Function.prototype.bind?

Комментарии:

1. .call выполняет функцию, на которую this указывает.

2. Да, это намеренно сбивает с толку, очевидно, что это должно быть головоломкой.

3. Я предполагаю, что f(fn, a, b, c) выполняется fn с аргументами a b c

4. Если бы вы могли опубликовать больше окружающего кода, это было бы более полезно для определения фактического использования кода. В его нынешнем виде, похоже, он каждый раз f() возвращает новую версию Function.prototype.call

Ответ №1:

Обычный способ, который Function.prototype.call используется, похож на:

 functionName.call(thisvalue, arg1, arg2, arg3)
  

Когда вызывается call метод, он получает функцию, названную functionName в качестве this своего контекста (точно так же, как это делает любой другой вызов метода), и вызывает ее.

В вашем коде мы используем bind() для создания новой функции, this контекст и первый аргумент которой привязаны к определенным значениям. Функция является Function.prototype.call , ее this контекст является Function.prototype.bind , а ее первый аргумент является Function.prototype.call . Таким образом, делая

 x = f(something)
  

будет эквивалентно вызову

 x = Function.prototype.bind.call(Function.prototype.call, something)
  

Тогда это эквивалентно:

 x = Function.prototype.call.bind(something)
  

Итак, x это тоже функция — это call метод с его this контекстом, привязанным к `чему-то. Итак, вызывая

 x(1, 2, 3)
  

эквивалентно

 something.call(1, 2, 3)
  

Я очень надеюсь, что я понял это правильно, это действительно запутанно, как лабиринт приключений с маленькими извилистыми проходами, все разные.

Комментарии:

1. Я думаю, вы правы. Глядя на шаблон использования, это действительно имеет смысл после вашего объяснения

2. Я написал ответ, и это не имеет смысла для меня!