2010-02-10 3 views
5

Мне нередко приходится связываться? некоторая функция, требующая аргументов. Решение, которое я использую, это перенос функции для привязки внутри анонимной функции.Javascript предотвращает анонимную функцию?

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(); 

Есть ли более элегантный способ сделать это?

+0

Ваш синтаксис является неправильным; вы имели в виду 'function() {foo (abc); }) ' – SLaks

+0

Спасибо, изменено – Jacco

ответ

10

Вы можете сделать curryer, как это:

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)); 
+2

отличная идея, спасибо +1 –

+0

Должен ли он быть заполненным курьером? – SLaks

+0

Я никогда не думал, что JavaScript начнет заставлять меня голодать ... –

-2

вы даже можете принять смотреть на некоторые JS LIBS

для примера YUI

что вы делаете

YUI().use('node',function(Y){ 
    Y.one("#elementID").on('click', function(){ 
    // do your stuff here 
    }); 
}); 
+0

Это не отвечает на вопрос. – SLaks

1

Это нормально. У вас есть, по сути, использование callback или «делегат».

Кулер SLaks - это хороший синтаксический сахар, если вам приходится часто это делать в скрипте.

0

Значит, в вашем коде есть функция foo(), которая принимает событие в качестве аргумента? Если это все, что вы хотите сделать, то ваш attachEventHandler() можно записать как:

attachEventHandler(elementId, 'click', foo); 

Что происходит там, что вместо вызова Foo() это пропускание ссылки на Foo().

Это ближе к тому, о чем вы думаете?

+0

Он, кажется, пытается каррировать параметры; Я считаю, что параметр 'abc' в его анонимном методе существует только по ошибке. – SLaks

1

Вы можете скрыть функцию слова, если вы предпочитаете «карри», но ваш оригинальный метод делает то же самое без накладных расходов.

Вам не нужно аргумент в скобках в анонимной FUNCTION- он по-прежнему в объеме при определении это-

abc = 'some value'; 
attachEventHandler(elementId, 'click', function(abc){foo(abc);}) 
could be: 
attachEventHandler(elementId, 'click', function(){foo(abc)}); 
+0

На самом деле аргумент в круглых скобках не совпадает.Его исходный код (до того, как он отредактировал вопрос) передаст объект события, который передается анонимной функции на 'foo'. – SLaks

+0

Этот вопрос касался не передачи какого-либо события, поэтому в этом случае ваш ответ наступает. Если я должен был передать событие, первое решение будет отличаться от второго. – Jacco