5

我经常要绑定?一些需要参数的函数。我使用的解决方案是将要绑定的函数包装在匿名函数中。

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

有没有更优雅的方式来做到这一点?

4

5 回答 5

10

你可以做一个咖喱,像这样:

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) );
于 2010-02-10T16:15:38.563 回答
1

没关系。您所拥有的本质上是使用回调或“委托”。

如果您必须经常在脚本中执行此操作,则 SLaks 的 curryer 是一些不错的语法糖。

于 2010-02-10T16:23:20.493 回答
1

如果您更喜欢 'curry',您可以隐藏单词 function,但是您的原始方法可以在没有开销的情况下执行相同的操作。

您不需要匿名函数括号中的参数-定义它时它仍在范围内-

abc = 'some value';
attachEventHandler(elementId, 'click', function( abc ){foo( abc );})
could be:
attachEventHandler(elementId, 'click', function(){foo(abc)});
于 2010-02-10T16:51:16.587 回答
0

因此,在您的代码中,您有一个函数foo()将事件作为参数?如果这就是你想要做的,那么你的attachEventHandler()可以写成:

attachEventHandler(elementId, 'click', foo);

那里发生的事情是,它不是调用 foo()而是传递对 foo() 的引用

这更接近你的想法吗?

于 2010-02-10T16:29:43.703 回答
-2

你甚至可能想看看一些 js 库

例如 YUI

你做什么

YUI().use('node',function(Y){
  Y.one("#elementID").on('click', function(){
    // do your stuff here
  });
});
于 2010-02-10T16:22:49.767 回答