【问题标题】:Please explain Javascript image rotation code请解释Javascript图像旋转代码
【发布时间】:2012-08-16 23:19:24
【问题描述】:

我正在使用以下代码创建一个基本的图像旋转功能,并且我想更好地了解它的工作原理。我得到了大部分内容,但是旋转函数中使用“严格”等于和三元运算符的行,即 (i === (imgs.length -1) ) ? i=0 : i++ ;) 有点令人困惑。我知道它正在增加计数器,但在那之前它在做什么?

var i, imgs, pic;

function rotate()
{
    pic.src = imgs[i] ;
    (i === (imgs.length -1) ) ? i=0 : i++ ;
    setTimeout( rotate, 2500 );
}

function init()
{
    pic = document.getElementById("pic");

    imgs = [ 'images/shimano_offer.jpg', 'images/kids_bikes1.jpg', 'images/cycle_to_work.jpg' ] ;

    var preload= new Array();
    for( i=0; i< imgs.length; i++ )
    {
        preload[ i ] = new Image();
        preload[ i ].src = imgs[ i ];
    }

    i=0;

    rotate();
}

代码来自http://ineasysteps.com/products-page/all_books/javascript-in-easy-steps-4th-edition/

【问题讨论】:

  • 您好 johnmc321,如果我们中的一个人回答了您的问题,您可以点击答案旁边的复选框接受它吗?谢谢。
  • @AresAvatar,完成,抱歉耽搁了

标签: javascript image-rotation


【解决方案1】:

线

(i === (imgs.length -1) ) ? i=0 : i++ ;

可以(并且应该)写成:

if (i === (imgs.length - 1)) {
    i = 0;
} else {
    i += 1;
}

是的,前者字节少,但更难理解和调试。

编辑: Norguard 指出了一种使用三元形式的有效方法。我使用三元组,但在这种情况下我不会,因为我可能想在调试时在“i = 0”条件上放置一个断点。如果您预计不需要断点,他的方法更紧凑,更简洁,可能更可取。

【讨论】:

  • 好的,这个结构看起来更熟悉了。我认为 '- 1' 指的是 imgs 数组中的最后一项是否正确?
  • 是的,你是。 JavaScript 数组是从零开始的,就像 C 或 C++ 一样,所以第一个元素是 [0],最后一个元素是 [length -1]。
【解决方案2】:

我不同意 Ares 的观点——这是推理i 价值的一种完全有效的方式。

对于特定的三元语句(它就是这样)令人困惑的部分是三元语句应该设置 ONE VALUE

这是设置单个变量的理想情况。

有意义且易于推理的三元语句如下:

var mood = (bank_account_balance > 0) ? "happy" : "unhappy";
console.log(mood);

如果余额为正,则mood 是“快乐”,否则是“不快乐”,这是一种非常简洁的方式。 这很好,简洁,不需要完整的:

if (....) {
    this_one_var = "one_thing";
} else if (...) {
    this_one_var = "something_else";
} else {
    this_one_var = "another_thing";
}

this_one_var = (...) ? "one_thing" : (...) ? "something_else" : "another_thing";
this_other_var = (...) ? "one_thing2" : (...) ? "something_else2" : "another_thing2";

你能想象根据不同的条件在第一种形式而不是第二种形式中分配 6 个不同的变量吗?

我经常使用第二个,它使得赋值非常非常整洁。

问题在于,在示例中,他们没有这样做。 他们使用三元作为 if 语句来触发代码...... ...这就是 if 的用途。

请参阅 Ares 的回答,了解如何将其视为 if。

但是作为三元赋值:

var length = imgs.length;
i = (i === length - 1) ? 0 : i + 1;

如果i 是数组的最后一个索引,则将i 设置为0,否则将i 设置为自身加一。 不再有任何疯狂的逻辑可以跳过来弄清楚你是如何到达那里的。

【讨论】:

  • +1 Norguard,您的方式比 OP 的示例要好得多。但是,请记住,如果您使用单行,则仅在 i 重置为 0 时才设置断点要困难得多,在这种情况下,您可能非常想这样做。我也使用三元组,但我可能只想在其中一个条件上设置断点时从不使用。
  • 当然。但该功能只做三件事。让任务变得简单对可视化调试东西大有帮助。就像我提到的,如果你有六个变量要在一个函数中设置,这会导致 3-deep nested-if 和 if-else-nested-if 的情况,做三元赋值会在几秒钟内把所有这些都弄平,所以你首先,那里不太可能需要断点,而您可以专注于中断操作。
  • 同意,我编辑了我的答案,指出根据具体情况,您的答案可能是更可取的方式。
  • 两者都更可取,视情况而定。拥有完整开发的实用基础工具包的好处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 2011-09-06
  • 1970-01-01
相关资源
最近更新 更多