Javascript 通过另一个函数访问动态数组中的值

Javascript 通过另一个函数访问动态数组中的值,javascript,Javascript,我有一个函数,可以设置一组setTimeout函数。所有函数都添加到数组funcs;然而,当我尝试使用stopplay().clearTimeout停止它们时,数组没有值 如何访问这些函数以及它们上的clearTimeout var funcs = new Array(); function playWithDelay(){ for (var i = 0; i < PlayDatesArray.length; i++) { funcs[i] = c

我有一个函数,可以设置一组
setTimeout
函数。所有函数都添加到数组
funcs
;然而,当我尝试使用
stopplay().clearTimeout
停止它们时,数组没有值

如何访问这些函数以及它们上的
clearTimeout

var funcs = new Array();    

function playWithDelay(){   
    for (var i = 0; i < PlayDatesArray.length; i++) { 
        funcs[i] = createfunc(i); 
    } 

    for (var j = 0; j < PlayDatesArray.length; j++) { 
        funcs[j]();
    } 
}

function createfunc(i) { 
    return function() {        
        setTimeout(function(){            
        //my function
      }, i*1500);        
    }; 
}

function stopplay(){    
    alert(this.funcs.count);
    for (var i = 0; i< funcs.count; i++){ 
        //things I tried
        var tmpFunction = funcs[i]; 
        //funcs[i].splice(i, 1);
        clearTimeout(tmpFunction);
        clearTimeout(funcs[i]);
        funcs[i]=tmpFunction;
    }    
}
var funcs=new Array();
函数playWithDelay(){
对于(var i=0;i
您正在从
stopplay()
访问
this.funcs
,但是funcs被定义(至少在本例中)为全局变量。根据调用stopplay()的调用代码,
this
与创建
funcs
的全局范围不同

更新stopplay,将
this.funcs.count
更改为
funcs
,以查看是否使用上面创建的数组发出警报

另外,您确定funcs数组具有
计数
?我会尝试使用
length

function stopplay(){    
    alert(funcs.length);
    for (var i = 0; i< funcs.length; i++){ 
    ....
    }    
}
函数stopplay(){
警报(函数长度);
对于(var i=0;i
编辑:

您没有保存setTimeout的返回值,因此无法清除超时。通过函数传递clearTimeout不会清除超时

你可以这样做:

var timers = new Array();


function createfunc(i) { 
   return function() {        
      timers.push( setTimeout(function(){            
        //my function
      }, i*1500)) ;        
   }; 
}


function stopplay(){    
    for (var i = 0; i< timers.length; i++){ 
        clearTimeout(timers[i]);
    }    
}
var timers=newarray();
函数createfunc(i){
返回函数(){
timers.push(setTimeout)(函数(){
//我的职能
},i*1500);
}; 
}
函数stopplay(){
对于(var i=0;i
您正在从
stopplay()
访问
this.funcs
,但是funcs被定义(至少在本例中)为全局变量。根据调用stopplay()的调用代码,
this
与创建
funcs
的全局范围不同

更新stopplay,将
this.funcs.count
更改为
funcs
,以查看是否使用上面创建的数组发出警报

另外,您确定funcs数组具有
计数
?我会尝试使用
length

function stopplay(){    
    alert(funcs.length);
    for (var i = 0; i< funcs.length; i++){ 
    ....
    }    
}
函数stopplay(){
警报(函数长度);
对于(var i=0;i
编辑:

您没有保存setTimeout的返回值,因此无法清除超时。通过函数传递clearTimeout不会清除超时

你可以这样做:

var timers = new Array();


function createfunc(i) { 
   return function() {        
      timers.push( setTimeout(function(){            
        //my function
      }, i*1500)) ;        
   }; 
}


function stopplay(){    
    for (var i = 0; i< timers.length; i++){ 
        clearTimeout(timers[i]);
    }    
}
var timers=newarray();
函数createfunc(i){
返回函数(){
timers.push(setTimeout)(函数(){
//我的职能
},i*1500);
}; 
}
函数stopplay(){
对于(var i=0;i
clearTimeout
获取由
setTimeout
返回的id,而不是函数本身的引用

因此,您需要的是(在ES5代码中)

var超时=[];
函数createfunc(i){
返回函数(){
返回setTimeout(函数(){
//我的职能
},i*1500);
}; 
}
//创建函数的代码
函数playWithDelay(){
对于(var i=0;i
clearTimeout
获取由
setTimeout
返回的id,而不是函数本身的引用

因此,您需要的是(在ES5代码中)

var超时=[];
函数createfunc(i){
返回函数(){
返回setTimeout(函数(){
//我的职能
},i*1500);
}; 
}
//创建函数的代码
函数playWithDelay(){
对于(var i=0;i
是的,明白了,把
c#
语法搞砸了。但是,clearTimeout并没有被应用,计划的函数也会被执行。请看我的编辑,您没有保存调用到setTimeout的返回值。您需要将setTimeout调用的返回值传递给clearTimeout,而不是第一次传递给setTimeout的函数。是的,得到了,语法混乱。但是,clearTimeout并没有被应用,计划的函数也会被执行。请看我的编辑,您没有保存调用到setTimeout的返回值。您需要将setTimeout调用的返回值传递给clearTimeout,而不是第一次传递给setTimeout的函数。