0

首先,据我了解,某些语法 javascript 和 actionscript 在函数方面的操作方式非常相似。在这两种语言中,我都需要将局部变量添加到某种事件侦听器中。例如在动作脚本中:

public class Foo {
     public function handleBar():void {
         this.bla(); this.blabla();
     }
     public function createButton():void {
         SomeSortOfButton button = new SomeSortOfButton();

         //HERE COMES THE AWKWARD PART:
         button.addEventListener(MouseEvent.CLICK, 
             (function (foo:Foo) {
                 return function (event:MouseEvent):void {
                      //I want to do stuff with foo, hence the function that returns a function.
                      foo.handleBar();
                 };
            })(this)
        );
     }
}

在 javascript (+jquery) 中,我不时有这样的事情:

var foo = ......;
$("#button").click(
    (function(bar) { 
         return function(event) {
             //do stuff with bar (which is defined as foo in the first line)
         };
    )(foo)
);

我喜欢它的工作方式,但就语法而言,恕我直言,这是完全不行的。有没有其他选择?我在 actionscript 中尝试的是在处理程序中使用默认参数:

public class Foo {
     public function handleBar():void {
         this.bla(); this.blabla();
     }
     public function createButton():void {
         SomeSortOfButton button = new SomeSortOfButton();

         //HERE COMES THE ALTERNATIVE:
         button.addEventListener(MouseEvent.CLICK, 
             function (event:MouseEvent, foo:Foo = this):void {
                 //I want to do stuff with foo, hence the function that returns a function.
                 foo.handleBar();
             }
         );
     }
}

但这是不允许的,因为foo:Foo = this编译时无法解决。很公平,但我仍然想知道,在 javascript 和 actionscript 中是否有上述构造的语法糖?我非常喜欢使用单个函数,而不是返回函数的函数。

我希望答案的形式是:“(据我所知,)没有其他方法可以传递局部变量”或“是的,你可以这样做:....”。

但是,当然,非常感谢任何评论!

4

1 回答 1

1

这是需要“咖喱”功能的经典示例。Prototype 库有一个,但也很容易推出自己的库:

function curry(func) {
    var args = Array.prototype.slice.call(arguments, 1);
    return function() {
        return func.apply(this, Array.prototype.concat.apply(args, arguments));
    };
}

然后在您的 JavaScript 示例中:

var foo = ......;
$("#button").click(curry(function(bar, event) {
  //do stuff with bar (which has the value of `foo` as of when we hooked up the handler)
}, foo));

ES5 有Function#bind,用于this在函数中设置值,但也可以用于柯里化。但是如果你使用Function#bind,你不能this只是通过(curry上面就是这样做的:它用调用它的任何this值调用函数,而不是一个特定的值)。

这是在一般情况下。在 jQuery 事件处理程序的特定情况下,jQuery 为您提供了一种方法:

var foo = ......;
$("#button").click({bar: foo}, function(event) {
  //do stuff, using event.data.bar
});

您必须使用带有 的对象click,但如果您使用,则可以使用其他东西on

于 2013-05-09T09:58:34.590 回答