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