Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 匿名函数中变量的奇怪行为?_Actionscript 3_Flash_Function_Variables_Anonymous Function - Fatal编程技术网

Actionscript 3 匿名函数中变量的奇怪行为?

Actionscript 3 匿名函数中变量的奇怪行为?,actionscript-3,flash,function,variables,anonymous-function,Actionscript 3,Flash,Function,Variables,Anonymous Function,有人能解释为什么下面代码的跟踪结果是“5,5,5,5,5”而不是“1,2,3,4,5”,以及如何使匿名函数引用数组中的collect元素吗?(在本例中,“var item”应该引用列表[0]、[1]、[2]、[3]、[4]) 这是两件事的结果: AS3中的函数级作用域:中的变量声明(列表中的var项:int)相当于在函数的开头(在您的示例中,在代码的开头)声明一个var项:int 匿名函数是闭包,它不仅包含指定的代码trace(item),还包含运行该代码的环境。具体来说,由代码创建的每个匿名函

有人能解释为什么下面代码的跟踪结果是“5,5,5,5,5”而不是“1,2,3,4,5”,以及如何使匿名函数引用数组中的collect元素吗?(在本例中,“var item”应该引用列表[0]、[1]、[2]、[3]、[4])


这是两件事的结果:

  • AS3中的函数级作用域:
    中的变量声明(列表中的var项:int)
    相当于在函数的开头(在您的示例中,在代码的开头)声明一个
    var项:int

  • 匿名函数是闭包,它不仅包含指定的代码
    trace(item)
    ,还包含运行该代码的环境。具体来说,由代码创建的每个匿名函数都知道它应该使用
    变量(在函数范围中声明)进行打印(通过
    跟踪()


  • 因此,
    被分配给
    列表
    的所有元素,然后保留最后一个值(即5)。它存在(不超出范围),当这些匿名函数启动时,它们中的每一个都会查看相同的
    项并打印相同的值。

    代码的问题在于创建了一个闭包,以后可以访问。 对于您想要做的事情,您需要创建多个闭包,以后可以访问这些闭包

    var list:Array=[1,2,3,4,5];
    var funcs:Array=[];
    
    var closure_factory = function(index) {
        return function() { trace(index); };
    };
    
    for each(var item:int in list){
       funcs.push(closure_factory(item));
    }
    
    for each(var func:Function in funcs){
        func();
    }
    

    闭包每个func的项都是共享的,并显示最后一个项的值您的是JavaScript中几乎完全不好的示例:Douglas Crockford的好部分:)尝试以下方法来修复它:
    var helper:Function=Function(i:int):Function{return Function():void{trace(i);}
    然后更改为
    funcs.push(helper(item))它所做的是将项的当前循环值传递给由创建的新闭包helper@Lukasz“Severiaan”Grela仍然是这个页面上最有价值的信息。谢谢你的回复,这个答案让我明白了我的代码有什么问题。
    
    var list:Array=[1,2,3,4,5];
    var funcs:Array=[];
    
    var closure_factory = function(index) {
        return function() { trace(index); };
    };
    
    for each(var item:int in list){
       funcs.push(closure_factory(item));
    }
    
    for each(var func:Function in funcs){
        func();
    }