Javascript 函数接收未定义的值

Javascript 函数接收未定义的值,javascript,Javascript,我有一个调用函数的超时,直到完成100%的进度。然后它执行我分配给它的函数。只有给它的值是未定义的或至少是它的一部分 我不确定代码在哪个阶段会丢失传递的值,从而使其返回未定义的,但我已在实际操作中对其进行了JS处理,以便您看到它: 我的最终结果是接收正确的值,然后删除给定元素,如下所示: function rmv_div(div_id) { //div_id is not properly defined so cannot find the div. document.getE

我有一个调用函数的超时,直到完成100%的进度。然后它执行我分配给它的函数。只有给它的值是未定义的或至少是它的一部分

我不确定代码在哪个阶段会丢失传递的值,从而使其返回
未定义的
,但我已在实际操作中对其进行了JS处理,以便您看到它:

我的最终结果是接收正确的值,然后删除给定元素,如下所示:

function rmv_div(div_id) {
   //div_id is not properly defined so cannot find the div.
    document.getElementById('result').innerHTML = div_id;
    var div = document.getElementById(div_id);
    div.parentNode.removeChild(div);
}

问题在于,在
func
中使用的变量
i
是在该函数的范围之外创建的,并且在每次迭代中都会增加。然后,当您在末尾调用
func
时,
i
等于
array.length
,因此
array[i]
是未定义的

您可以在每次迭代时创建另一个不增加的变量来解决此问题:

解决方案1

演示:

for(变量i=0;i
解决方案2

演示:

for(变量i=0;i
这里的问题是没有在闭包内隔离循环变量
i
。但是,通过使用对象可以更优雅地解决这个问题

首先,我将介绍一个对象,它将封装您想要的内容;它通过一个bar元素和一个函数进行初始化,当它计数到100时调用该函数。因此,我将其称为
条形码计数器

function BarCounter(element, fn)
{
    this.element = element;
    this.fn = fn;

    this.text = element.getElementsByTagName('div')[0];
    this.counter = 0;
}
这只是构造器;它没有做任何有用的事情;它解析文本元素,它只是在给定元素下面找到的第一个
标记,并存储该引用以供以后使用

现在我们需要一个函数来完成这项工作;让我们称之为
run()

最后一步是调整代码的其余部分:

var array = [1];
for (var i = 0; i < array.length; ++i) {
    var bar = new BarCounter(
        document.getElementById('bar' + array[i]), 
        removeDiv
    );
    bar.run();
}
var数组=[1];
对于(变量i=0;i
现在很简单;它创建一个新的
BarCounter
对象并调用其
run()
方法。完成:)

顺便说一句,您也可以选择从对象中删除元素;当然,这取决于你自己的需要


你能解释一下为什么
j=i修复它?我不明白这是怎么回事difference@Oriol-在var语句中有一个分号,应该是逗号。@dc5我为他修正了:)
function BarCounter(element, fn)
{
    this.element = element;
    this.fn = fn;

    this.text = element.getElementsByTagName('div')[0];
    this.counter = 0;
}
BarCounter.prototype.run = function()
{
    var that = this;

    if (this.counter < 100) {
        this.text.innerHTML = this.counter++;

        setTimeout(function() {
            that.run();
        }, 70);
    } else {
        this.fn(this.element);
    }
}
function removeDiv(element)
{
    element.parentNode.removeChild(element);
}
var array = [1];
for (var i = 0; i < array.length; ++i) {
    var bar = new BarCounter(
        document.getElementById('bar' + array[i]), 
        removeDiv
    );
    bar.run();
}