Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.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
Javascript setTimeout函数出现问题';s作为回调函数执行的函数中的变量_Javascript_Callback_Settimeout - Fatal编程技术网

Javascript setTimeout函数出现问题';s作为回调函数执行的函数中的变量

Javascript setTimeout函数出现问题';s作为回调函数执行的函数中的变量,javascript,callback,settimeout,Javascript,Callback,Settimeout,我试图在函数plotReglaFalsa中执行一些带有setTimeout的语句,该函数实际上作为回调函数在getSendingJSON(“/plot”,args,plotReglaFalsa) 这是由setTimeout执行语句的代码片段: for (series in respuesta) { if (series != "x" && series != "y" && series != "raiz") {

我试图在函数
plotReglaFalsa
中执行一些带有
setTimeout
的语句,该函数实际上作为回调函数在
getSendingJSON(“/plot”,args,plotReglaFalsa)

这是由
setTimeout
执行语句的代码片段:

for (series in respuesta) {
                if (series != "x" && series != "y" && series != "raiz") {

                    setTimeout(function(respuesta,series){plot.highlight(c,[respuesta[series].a,0])},1500)                      
                    setTimeout(function(respuesta,series){plot.highlight(c,[respuesta[series].b,0])},1800)  
                    c++
                }
}
这里的问题是,一旦回调发生,respuesta和so系列实际上是存在的

当我尝试运行时,会得到以下控制台输出:

这是我的全部代码:

function plotReglaFalsa(respuesta) {

            var result = []

            result.push({
            label: "fx",
            color: "red",
            data: _.zip(respuesta['x'], respuesta['y'])
            })

            for (series in respuesta) {
                if (series != "x" && series != "y" && series != "raiz") {
                    result.push({
                        color: "blue",
                        data: [[]]
                    })
                }
            }

            var plot = $.plot(  $("#placeholder"), 
                                result, 
                                {   selection:{mode: "xy"},  
                                    zoom: { interactive: true }, 
                                    pan: { interactive: true }, 
                                    grid: { markings: [{ xaxis: { from: 0.0, to: 0.0 }, color: 'black', lineWidth: 2 }, { yaxis: { from: 0.0, to: 0.0 }, color: 'black', lineWidth: 2 }] }
                                })
            plot.getOptions().selection.mode = null

            var c = 1

            for (series in respuesta) {
                if (series != "x" && series != "y" && series != "raiz") {

                    setTimeout(function(respuesta,series){plot.highlight(c,[respuesta[series].a,0])},1500)
                    setTimeout(function(respuesta,series){plot.highlight(c,[respuesta[series].b,0])},1800)
                    c++
                }
            }

        }

        getSendingJSON("/plot",args,plotReglaFalsa)


            function resaltarPuntos(plot,respuesta,series,c,x){
            plot.highlight(c,[respuesta[series].x,0])
        }

        function desResaltarPuntos(plot){
            plot.unhighlight()
        }

getSendingJSON
实际上是AJAX。如何完成此操作?

根据elclanrs的评论:

每次代码遍历
for
循环时,它都会修改
序列的值。因此,在调用
setTimeout()
时,
series
的值已更新为
respuesta
中的最后一个值

您需要使用闭包,这样您的
setTimeout()
就可以像在迭代过程中一样使用
series
的值


您将函数传递给
setTimeout()
,因此
setTimeout()
将调用它们。但是他们不知道您想要的变量是什么,所以他们无法将它们传递给函数。定义函数参数不会以某种方式导致将它们传递给函数。将给您几个警告——“不要在循环中生成函数”…现代JS引擎将允许您将想要的数据直接传递到
setTimeout
。比如:
setTimeout(函数(respuesta,series){/*…*/},1500,respuesta,series)在较旧的浏览器中不起作用。@CookieMonester我使用的是最新版本的Firefox。只有从传递给
setTimeout()
的匿名函数中删除参数,此功能才会起作用,其目的是通过将值分配给循环未更新的其他变量来避免闭包的后果。这就是匿名函数接收
x
?@diegaoguilar yes的原因。循环中series的值被传递给x,然后该值可用于传递给setTimeout的函数。为每个函数在每个循环上创建一个新的x实例,避免了多次引用series的一个实例的后果。@DiegoaGuillar:需要从正在传递的函数中删除
respuesta,x
参数,才能使此技术起作用<代码>设置超时(函数(){…
function plotReglaFalsa(respuesta) {

            var result = []

            result.push({
            label: "fx",
            color: "red",
            data: _.zip(respuesta['x'], respuesta['y'])
            })

            for (series in respuesta) {
                if (series != "x" && series != "y" && series != "raiz") {
                    result.push({
                        color: "blue",
                        data: [[]]
                    })
                }
            }

            var plot = $.plot(  $("#placeholder"), 
                                result, 
                                {   selection:{mode: "xy"},  
                                    zoom: { interactive: true }, 
                                    pan: { interactive: true }, 
                                    grid: { markings: [{ xaxis: { from: 0.0, to: 0.0 }, color: 'black', lineWidth: 2 }, { yaxis: { from: 0.0, to: 0.0 }, color: 'black', lineWidth: 2 }] }
                                })
            plot.getOptions().selection.mode = null

            var c = 1

            for (series in respuesta) {
                if (series != "x" && series != "y" && series != "raiz") {

                    setTimeout(function(respuesta,series){plot.highlight(c,[respuesta[series].a,0])},1500)
                    setTimeout(function(respuesta,series){plot.highlight(c,[respuesta[series].b,0])},1800)
                    c++
                }
            }

        }

        getSendingJSON("/plot",args,plotReglaFalsa)


            function resaltarPuntos(plot,respuesta,series,c,x){
            plot.highlight(c,[respuesta[series].x,0])
        }

        function desResaltarPuntos(plot){
            plot.unhighlight()
        }
for (series in respuesta) {
    if (series != "x" && series != "y" && series != "raiz") {
        (function(x){
            setTimeout(function(){plot.highlight(c,[respuesta[x].a,0])},1500);                     
            setTimeout(function(){plot.highlight(c,[respuesta[x].b,0])},1800);
            c++;
         }(series))
    }     
}