Я довольно часто должен связать? некоторая функция, которая требует аргументов. Решение, которое я использую, переносит функцию для привязки в анонимной функции.
function foo( arg_0 ) {
// do stuff with: arg_0
}
function bar() {
var abc;
// stuff happens
abc = 'some value';
attachEventHandler(elementId, 'click', function(){foo( abc );});
}
bar();
Существует ли более изящный способ сделать это?
Вы можете сделать карриер, например, так:
function curry(func) {
var functionArgs = Array.prototype.slice.call(arguments, 1);
return function() { return func.apply(this, functionArgs); };
}
Использование:
attachEventHandler(elementId, 'click', curry(foo, abc) );
Альтернатива:
Function.prototype.curry = function() {
var func = this, functionArgs = arguments;
return function() { return func.apply(this, functionArgs); };
}
Использование:
attachEventHandler(elementId, 'click', foo.curry(abc) );
Итак, в вашем коде есть функция foo(), которая принимает событие в качестве аргумента? Если это все, что вы хотите сделать, то ваш attachEventHandler() может быть написан так:
attachEventHandler(elementId, 'click', foo);
Что там происходит, так это то, что вместо вызова foo() передается ссылка на foo().
Это ближе к тому, о чем вы думаете?
.Это нормально. По сути, у вас есть использование обратного вызова или «делегата».
Карриер SLaks - хороший синтаксический сахар, если вам приходится часто делать это внутри скрипта.
Вы можете скрыть слово «функция», если предпочитаете «карри», но ваш исходный метод делает то же самое без дополнительных затрат.
Вам не нужен аргумент в круглых скобках в анонимной функции - он все еще находится в области видимости, когда вы его определяете-
abc = 'some value';
attachEventHandler(elementId, 'click', function( abc ){foo( abc );})
could be:
attachEventHandler(elementId, 'click', function(){foo(abc)});
вы можете даже взглянуть на некоторые js-библиотеки
, например YUI
что вы делаете
YUI().use('node',function(Y){
Y.one("#elementID").on('click', function(){
// do your stuff here
});
});