Как в Javascript привязать аргументы к функции без привязки this
параметра?
Например:
//Example function.
var c = function(a, b, c, callback) {};
//Bind values 1, 2, and 3 to a, b, and c, leave callback unbound.
var b = c.bind(null, 1, 2, 3); //How can I do this without binding scope?
Как я могу избежать побочного эффекта, связанного с привязкой области действия функции (например, setting this
= null)?
Редактировать:
Извините за путаницу. Я хочу связать аргументы, а затем иметь возможность вызвать связанную функцию позже и заставить ее вести себя точно так, как если бы я вызвал исходную функцию и передал ей связанные аргументы:
var x = 'outside object';
var obj = {
x: 'inside object',
c: function(a, b, c, callback) {
console.log(this.x);
}
};
var b = obj.c.bind(null, 1, 2, 3);
//These should both have exact same output.
obj.c(1, 2, 3, function(){});
b(function(){});
//The following works, but I was hoping there was a better way:
var b = obj.c.bind(obj, 1, 2, 3); //Anyway to make it work without typing obj twice?
Я все еще новичок в этом, извините за путаницу.
Спасибо!
javascript
Imbue
источник
источник
this
?var b = c.bind(this, 1,2,3);
bind()
benull
? Кажется, отлично работает в FF.this
полностью освободить JavaScript. Это всегда что- то значит . Таким образом, привязкаthis
кthis
закрывающей функции имеет большой смысл.Ответы:
Вы можете это сделать, но лучше не думать об этом как об «привязке», поскольку именно этот термин используется для установки значения «это». Возможно, подумайте об этом как об «обертывании» аргументов в функцию?
Что вы делаете, так это создаете функцию, в которую встроены желаемые аргументы с помощью замыканий:
Надеюсь, я понял синтаксис прямо здесь. Что он делает, так это создает функцию с именем withWrappedArguments () (чтобы быть педантичным, это анонимная функция, назначенная переменной), которую вы можете вызывать в любое время в любом месте и всегда будет действовать с actualArg1Value и actualArg2Value, и всем остальным, что вы хотите добавить там. Вы также можете заставить его принимать дополнительные аргументы во время вызова, если хотите. Секрет в круглых скобках после последней закрывающей скобки. Это вызывает немедленное выполнение внешней функции с переданными значениями и создание внутренней функции, которая может быть вызвана позже. Затем переданные значения замораживаются во время создания функции.
По сути, это то, что делает bind, но таким образом явно видно, что обернутые аргументы являются просто замыканиями для локальных переменных, и нет необходимости изменять поведение this.
источник
f(x,y)
чтобы мы хотелиf(x)(y)
илиg=f(x); g(y)
. Поэтому мы бы изменилисьf=(x,y)=>x+y
наf=(x)=>(y)=>x+y
».В ES6 это легко сделать с помощью параметров rest в сочетании с оператором распространения .
Таким образом, мы можем определить функцию,
bindArgs
которая работает какbind
, за исключением того, что связаны только аргументы, но не context (this
).Затем для указанной функции
foo
и объектаobj
инструкцияэквивалентно
где привязаны только первый и второй аргументы, в
bar
то время как используется контекст,obj
указанный в вызове, а дополнительные аргументы добавляются после связанных аргументов. Возвращаемое значение просто пересылается.источник
let
иconst
еще не были доступны к тому времени, когда я впервые опубликовал это. Сейчас он обновлен.В родном
bind
методеthis
значение в функции результата теряется. Однако вы можете легко перекодировать общую прокладку, чтобы не использовать аргумент для контекста:источник
Function
но это сэкономило мне много времени и сэкономило некоторые уродливые обходные пути. Спасибоbind
. Вы легко можете превратить его вfunction bindArgs(fn){ …, args = slice.call(arguments, 1); …}
this
бытьa
. Выbind
, конечно, можете использовать вместо этого. Тем не менее, OP явно не заботится оthis
значении и хочет несвязанную частичную функцию.this
заключается в том, что функция используетthis
, но они не хотели связывать ее в тот момент. Кроме того, бит в вопросе OP//These should both have exact same output.
противоречит другим его частям.bind
вообще не работает с конструкторами, у связанных функций нет.prototype
. Нет,Function.prototype !== mymethod.prototype
Еще одна крошечная реализация для развлечения:
Как пользоваться:
источник
источник
const curry = (fn, ...curryArgs) => (...args) => fn(...curryArgs, args)
Сложно сказать, что именно вы в конечном итоге хотите сделать, потому что пример произвольный, но вы можете посмотреть на частичные (или каррирование): http://jsbin.com/ifoqoj/1/edit
Ссылка на статью Джона Ресига: http://ejohn.org/blog/partial-functions-in-javascript/
источник
partial
нужно вызыватьundefined
аргументы, а не то, что можно было бы ожидать, и нарушать функции, которые принимают произвольное количество параметров.this
объект все еще испорчен. Взгляните на: jsbin.com/ifoqoj/4/editВозможно, вы хотите привязать ссылку на это в последний, но ваш код: -
Уже применена привязка, например эта, а позже вы не можете ее изменить. Я предлагаю использовать ссылку также в качестве такого параметра: -
источник
Используйте
protagonist
!По сути, функция, которой вы хотите передать параметры, становится прокси-сервером, который вы можете вызвать для передачи переменной, и она возвращает функцию, которую вы действительно хотите делать.
Надеюсь это поможет!
источник
Анонимный пользователь разместил эту дополнительную информацию:
источник
Что ж, для примера, который вы дали, это подойдет
Если вы хотите гарантировать вложение параметров:
Но если это так, вам следует просто придерживаться своего решения:
Это лучший способ.
источник
Так просто?
Более общее решение:
источник
Используя LoDash, вы можете использовать
_.partial
функцию.источник
Почему бы не использовать обертку вокруг функции, чтобы сохранить это как миф?
источник
В jQuery 1.9 появилась именно эта функция с функцией прокси.
Пример:
источник
Пример использования JQuery:
вместо:
использовать это:
источник