嘿伙计我有这样的javascript文件:
Unit
当我使用items.images时,它会在控制台中返回以下内容:
// An object that holds all images and words.
var items = {
"images": [
{
"imageLink": "elephant.png",
"imageText": "Elephant"
},
{
"imageLink": "rabbit.jpeg",
"imageText": "Rabbit"
},
{
"imageLink": "tiger.jpg",
"imageText": "Tiger"
},
{
"imageLink": "turtle.png",
"imageText": "Turtle"
}
]
};
// Hide the buttons from the screen
var hidebuttons = function() {
document.getElementById("buttonWrapper").classList.add("hide");
};
var replaceTitle = function(title) {
document.getElementById("header").firstElementChild.innerHTML = title;
}
var rotateImage = function() {
console.log(items.images.length);
for (i = 0; i < items.images.length; i++) {
setInterval(function() {
// document.getElementById("imageToRotate").src= "img/" + items.images[i].imageLink;
console.log(items.images);
if (i === items.images.length -1) {
i = 0;
}
}, 1000);
}
}
但是我使用
Array[4]
0: Object
1: Object
imageLink: "rabbit.jpeg"
imageText: "Rabbit"
__proto__: Object
它总是返回“未定义”。有谁知道我做错了什么?谢谢您的帮助。干杯!
答案 0 :(得分:2)
因为当setTimeout
回调运行时,i
的值已经为i === items.images.length
。原因如here所述。看到这个简化:
for (var i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i);
}, 100);
}
我认为你想要像旋转木马这样的东西,如:
var i = 0;
setInterval(() => {
console.log(i);
i = (i + 1) % 3;
}, 1000);
您使用i
作为全局变量而不是本地变量,并且无缘无故地启动多个间隔计时器。
答案 1 :(得分:2)
我想你想要这样的东西:
var items = {
"images": [
{
"imageLink": "elephant.png",
"imageText": "Elephant"
},
{
"imageLink": "rabbit.jpeg",
"imageText": "Rabbit"
},
{
"imageLink": "tiger.jpg",
"imageText": "Tiger"
},
{
"imageLink": "turtle.png",
"imageText": "Turtle"
}
]
};
var rotateImage = function() {
var numberOfImages = items.images.length;
var i =0;
setInterval(function() {
//runs every second;
var image = items.images[i++];
console.log(image); //your logic with image should be here
if(i == numberOfImages){
i = 0;
}
}, 1000);
}
rotateImage();
答案 2 :(得分:1)
你陷入了陷阱:在JavaScript中,变量是功能范围的。这意味着,当你的setInterval被触发时你的i值为4(因为for循环结束然后将我留在4)。
或者,我认为你试图做的是,你以错误的方式嵌套代码,所以我重写了它,希望它现在做,你需要什么:
var rotateImage = function() {
var currentImageIndex = 0;
setInterval(function() {
console.log(items.images[currentImageIndex]); //do with it what you want.
currentImageIndex++;
if (currentImageIndex >= items.images.length) currentImageIndex = 0; //reached end. Reset counter
}, 1000);
};
如果我猜的是正确的话,该函数有点名不副实,因为它表明它只执行一个循环。它应该命名为startRotatingImages()或类似的东西。
答案 3 :(得分:0)
可能是这样:int temppin = 0;
int ledhigh = 7;
int ledlow = 8;
void setup()
{
Serial.begin(9600);
pinMode(temppin, INPUT);
pinMode(ledhigh, OUTPUT);
pinMode(ledlow, OUTPUT);
}
void loop()
{
int tempout = analogRead(temppin);
float volts = tempout * 5.0;
volts /= 1024.0;
float temp = (volts - 0.5) * 100 ;
Serial.print(temp); Serial.println(" celsius");
if (temp > 0){
Serial.print("high temp =");
digitalWrite(ledhigh, HIGH);
} else {digitalWrite(ledlow, HIGH);
Serial.print("low temp");
}
delay(3000);
}
您尚未在for循环中初始化for (i = 0; i < items.images.length; i++) {
,因此var i
仍未定义:)
编辑:解决了它。原因略有不同,但同样的问题。 i
仅在您第一次运行i
后才会定义。当它被定义时,它的值快速设置为4,这会使数组超过一个(有四个项目,rotateImage()
将访问第五个项目。)
答案 4 :(得分:0)
在得到@charlietfl的一些建议后,我摆脱了for循环并手动编写了一个解决问题的计数器。有关详细信息,请参阅下面的代码。
var rotateImage = function() {
var i = 0;
var interval = window.setInterval(function () {
i++;
document.getElementById("imageToRotate").src= "img/" + items.images[i].imageLink;
if (i === items.images.length -1) {
i = 0;
}
}, 125);
};