【问题标题】:Why shouldn't I make functions in a loop?为什么我不应该在循环中创建函数?
【发布时间】:2012-05-19 20:22:58
【问题描述】:

Jshint.com 建议以下代码:

Line 150: }, false );

Don't make functions within a loop.

但是,它让我不必多次编写 document.getElementById(),而是可以将 id 保存在一个数组中并循环遍历它们。

我觉得更简洁和可维护的代码。

function styleTwitter( pair_array )
{
    var i, input, label;
    for ( i = 0; i < pair_array.length; i+=2 ) 
    {
        input = document.getElementById( pair_array[ i ] );
        label = document.getElementById( pair_array[ i + 1 ] );

        input.addEventListener( "focus", function()
        { 
            if( input.value === '' )
            {
                label.style.opacity = 0; 
                input.style.border = '1px solid #888888'; 
            }
        }, false );

        input.addEventListener( "blur", function()
        {
            if( input.value === '' )
            {
                label.style.opacity = 1;
                new EffectsFont( label ).fade( 'up', 150 );
                input.style.border = '1px solid #dddddd'; 
            }

        }, false );
    }

【问题讨论】:

标签: javascript


【解决方案1】:

您是否尝试过创建一个函数来分析事件源并执行相同的操作?它既更容易掌握(阅读:更易于维护),而且不会占用内存(闭包捕获整个堆栈,因此它绝不便宜)。

【讨论】:

  • 好主意,这应该是 +1 的方式。
  • ...只需将可能有问题的代码拉出到另一个函数来隔离...好主意。
【解决方案2】:

当您执行诸如 getElementById() 查找之类的 DOM 操作时,它们的开销很大并且会降低页面速度。当您以编程方式在循环中应用不透明度等样式更改时,这些更改也很昂贵,因为浏览器每次都必须重新绘制屏幕。

现在,如果您有一个应用这些更改的 CSS 类,您可以在一个操作中应用所有更改,并节省数百次浏览器重绘操作。这就是人们应该避免循环 UI 更新的主要原因。

但是,这取决于您正在执行多少个循环。如果它没有减慢速度并且这是您唯一的循环,请不要担心。对于更高性能的应用程序来说,它更受关注。

附:请记住,当向这样的元素添加事件侦听器时,如果稍后从 DOM 中删除该元素,您也将它们删除,您将遇到内存泄漏。

【讨论】:

  • 我不认为它每次都会重新绘制屏幕。你确定,它不只是重绘元素吗?像 JQuery fade() 这样的函数是如何工作的?
  • 浏览器是一个巨大的图像(缓冲区)。当您将鼠标悬停在链接上时,会重新绘制该图像(链接)的一个小矩形,而不是整个屏幕。因此,在某些 IE 版本上,由于多次重绘,您会在使用 fade() 时看到奇怪的活动。每次更新属性时,浏览器都会安排重绘受影响的区域。但是,如果您使用 CSS3 过渡将淡入淡出动画交给浏览器,浏览器可以优化此过程。
猜你喜欢
  • 2014-05-13
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
相关资源
最近更新 更多