向actionscript或javascript函数添加局部变量

向actionscript或javascript函数添加局部变量,javascript,function,actionscript,local-variables,Javascript,Function,Actionscript,Local Variables,首先,我的理解是,从某些语法来看,javascript和actionscript在函数方面的操作方式非常相似。在这两种语言中,我都需要向某种事件侦听器添加一个局部变量。例如,在actionscript中: 公共类Foo{ 公用功能把手():无效{ this.bla();this.blabla(); } 公共函数createButton():void{ SomeSortOfButton=新建SomeSortOfButton(); //下面是尴尬的部分: 添加事件列表器(MouseEvent.CLI

首先,我的理解是,从某些语法来看,javascript和actionscript在函数方面的操作方式非常相似。在这两种语言中,我都需要向某种事件侦听器添加一个局部变量。例如,在actionscript中:

公共类Foo{
公用功能把手():无效{
this.bla();this.blabla();
}
公共函数createButton():void{
SomeSortOfButton=新建SomeSortOfButton();
//下面是尴尬的部分:
添加事件列表器(MouseEvent.CLICK,
(函数(foo:foo){
返回函数(事件:MouseEvent):void{
//我想用foo做一些事情,因此这个函数返回一个函数。
foo.把手();
};
})(本)
);
}
}
在javascript(+jquery)中,我不时会遇到这样的情况:

var foo=。。。。。。;
$(“#按钮”)。单击(
(功能(bar){
返回函数(事件){
//使用bar(第一行中定义为foo)执行任务
};
)(富)
);
我喜欢它的工作方式,但关于语法,它是一个完全不可能的imho。有其他选择吗?我在actionscript中尝试的是在处理程序中使用默认参数:

公共类Foo{
公用功能把手():无效{
this.bla();this.blabla();
}
公共函数createButton():void{
SomeSortOfButton=新建SomeSortOfButton();
//下面是另一种选择:
添加事件列表器(MouseEvent.CLICK,
函数(event:MouseEvent,foo:foo=this):void{
//我想用foo做一些事情,因此这个函数返回一个函数。
foo.把手();
}
);
}
}
但这是不允许的,因为foo:foo=中的这一点在编译时无法解决。很公平,但我仍然想知道,在javascript和actionscript中或两者中,上面描述的构造是否有语法糖?我强烈喜欢使用单个函数,而不是返回函数的函数

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


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

这是一个典型的示例,说明需要一个原型库。原型库有一个原型库,但您也可以很容易地推出自己的原型库:

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具有,用于设置函数中的
this
值,但也可用于curry。但如果使用
函数#bind
,则不能通过
this
(这就是上面的
curry
所做的:它使用调用它的
这个
值来调用函数,而不是特定的值)

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

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

您必须将对象与一起使用,但如果您使用,则可以使用其他对象。

很难判断您想要实现什么。在您的JavaScript示例中,为了避免事件处理程序使用
foo
。为什么?因为您以后要更改
foo
?如果您在eve中引用foonthandler,在内部函数的{}范围内,只有当foo是一个全局变量时,这才有效。而且,foo也可能会像你说的那样改变。@赫伯特:不,
foo
不一定是一个全局变量。它只需在函数定义的范围内。全局变量只是这个一般原则的一个特例。更多: