我正在使用jquery编写javascript中的幻灯片编码,当我遇到了几行代码正在执行的操作时。
问题是,我不理解它是如何工作的所以我可以修改它。
var imgs = [
'image1.jpg',
'image2.jpg',
'image3.jpg'];
var cnt = imgs.length;
$(function() {
setInterval(Slider, 4000);
});
function Slider() {
$('#imageSlide').fadeOut("slow", function() {
$(this).attr('src', imgs[(imgs.length++) % cnt]).fadeIn("slow");
});
}
这就是让我:
的路线[(imgs.length++) % cnt]
我正在读那个
3+1 % 3 = 1
现在每次执行时,该代码都不会修改任何变量。
cnt
将始终等于imgs.length
(3),imgs.length++
实际上并未对其进行修改,只是为该单次执行添加一个,是否正确?
无论它执行了多少次,它总是imgs[1]
但是当我执行代码时,它会在所有数组对象中正确运行。
修改
我只是添加了alert(imgs.length);
并确认++
确实改变了变量,但它对我来说仍然没有意义。
第一次运行,imgs.length = 4
之后的++。 4 % 3 = 1
所以应该运行数组对象[1]
而不是[0]
?
第二轮,5 % 3 = 2
第三轮,6 % 3 = 0
等等。但它不应该重置。但是,如果我放alert(imgs.length % cnt);
它只返回0,1,2而不是重置。
为什么?
答案 0 :(得分:3)
imgs.length++
的返回值为3,因此3%3 = 0但imgs.length
为4
,imgs
数组将包含4
项。
在控制台中尝试:
var x = [ 1, 2, 3 ]
x.length++
=> 3
x.length++
=> 4
x.length++
=> 5
x
[1, 2, 3, undefined, undefined, undefined]
因此,每次调用imgs.length++
时,它都会向数组追加一个项目。所以不是一个很好的代码,但简短:)
编辑:为什么很容易回答,一开始它包含cnt
个元素,所以代码将踩到每个图像并从头开始。因此,如果imgs
数组包含5
项,它将逐步执行5
项并从头开始。
此代码的唯一问题是,每次都会增加数组,浏览器会占用内存。
答案 1 :(得分:2)
我确信您知道imgs.length++
,如果它应用于任何其他变量,将添加一个,修改原始变量。
var x = 1;
alert(x++); // alerts 1
alert(x); // alerts 2
果然,这就是正在发生的事情。
脚本在每次运行时递增imgs
数组的长度,因此它从3移动到4到5到6等等。我不是Javascript内部的专家,所以我不确定如果这对性能有任何影响,但如果你明白length
实际上是一个可写属性,那一切都是有道理的。
答案 2 :(得分:0)
我不是100%肯定javascript,但我知道imgs.length++
的其他语言与imgs.length = imgs.length + 1
相同,因此应该进行修改。
我认为这是一个“聪明的伎俩”,如果使用的话应该记录下来。 它有点打破了长度意味着什么的语义,所以虽然逻辑上对于计算机是正确的,但对于属性名称来说它没有多大意义
所以我猜它确实会改变长度,但我仍然不建议在没有记录的情况下使用它。一个更明确的方法是声明一个新的变量i = 0
并用imgs.length++
替换i++
,因为虽然在这种情况下它可能不重要,但如果你正在做其他任何事情数组,现在的长度可能不是你想象的那样。
关于编辑:
6%3是0而不是3
模数(在编程中,纯粹的数学术语略有不同)意味着除以并取余数
6/3 = 2,余数为0
7/3 = 2,余数为1
8/3 = 2,余数为2
9/3 = 3,余数为0,
答案 3 :(得分:0)
(imgs.length ++)%cnt
将导致图像一遍又一遍地遍历每个图像。
JavaScript中的百分号(%)表示它使用Modulus(除法余数)运算符。
示例:
答案 4 :(得分:0)
好吧,Slider运行的每4秒钟扩展一次数组,所以 你得到:
3+1 % 3 = 1
4+1 % 3 = 2
5+1 % 3 = 0
依此类推:))
答案 5 :(得分:0)
如果您希望将来您的代码更具可读性,我个人建议您将代码更改为以下内容:
var imgs = [
'image1.jpg',
'image2.jpg',
'image3.jpg'];
var i = 0;
$(function() { // This is a shortcut for $(document).ready();
setInterval(Slider, 4000);
});
function Slider() {
$('#imageSlide').fadeOut("slow", function() {
i = (i+1) % imgs.length;
$(this).attr('src', imgs[i]).fadeIn("slow");
});
}