#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 c4. Если бы вы могли опубликовать больше окружающего кода, это было бы более полезно для определения фактического использования кода. В его нынешнем виде, похоже, он каждый раз
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. Я написал ответ, и это не имеет смысла для меня!