2010-02-10 110 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 2010-02-10 16:33:31

+0

谢谢,更改 – Jacco 2010-02-10 16:48:33

回答

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 – 2010-02-10 16:25:20

+0

应该拼写currier吗? – SLaks 2010-02-10 16:26:21

+0

我从来没有想过JavaScript会开始让我饿... – 2010-02-10 17:03:41

-2

你甚至可能想借此看看一些JS库

例如YUI

你做什么

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

这并不回答这个问题。 – SLaks 2010-02-10 16:26:05

1

这很好。您拥有的基本上是使用callback或“代表”。

如果你必须在脚本中经常这样做,SLaks的currying是一些很好的语法糖。

0

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

attachEventHandler(elementId, 'click', foo); 

这是怎么回事存在,与其调用foo()它传递一个参考为foo()

这更接近你的想法吗?

+0

他似乎试图咖喱参数;我相信匿名方法中的'abc'参数只是出错。 – SLaks 2010-02-10 16:34:34

1

如果你喜欢“咖喱”,你可以隐藏这个词的功能,但是你的原始方法在没有开销的情况下做同样的事情。

你并不需要在匿名的功能 - 括号内的参数仍然是在范围上,当你定义它 -

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

实际上,将参数放在圆括号中是不一样的。他的原始代码(在编辑问题之前)会将赋予匿名函数的事件对象传递给“foo”。 – SLaks 2010-02-10 17:03:10

+0

这个问题不是关于传递一个事件,所以,在这种情况下,你的答案是现货。如果我要通过一个活动,第一个解决方案将与第二个解决方案不同。 – Jacco 2010-02-10 17:13:22