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

Существует ли более изящный способ сделать это?

5
задан Jacco 10 February 2010 в 16:47
поделиться

5 ответов

Вы можете сделать карриер, например, так:

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) );
10
ответ дан 13 December 2019 в 22:07
поделиться

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

attachEventHandler(elementId, 'click', foo);

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

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

.
0
ответ дан 13 December 2019 в 22:07
поделиться

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

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

1
ответ дан 13 December 2019 в 22:07
поделиться

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

Вам не нужен аргумент в круглых скобках в анонимной функции - он все еще находится в области видимости, когда вы его определяете-

abc = 'some value';
attachEventHandler(elementId, 'click', function( abc ){foo( abc );})
could be:
attachEventHandler(elementId, 'click', function(){foo(abc)});
1
ответ дан 13 December 2019 в 22:07
поделиться

вы можете даже взглянуть на некоторые js-библиотеки

, например YUI

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

YUI().use('node',function(Y){
  Y.one("#elementID").on('click', function(){
    // do your stuff here
  });
});
-2
ответ дан 13 December 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: