2014-02-21 53 views
0
var each = _.each = _.forEach = function(obj, iterator, context) { 
    if (obj == null) return obj; 
    if (nativeForEach && obj.forEach === nativeForEach) { 
     obj.forEach(iterator, context); 
    } else if (obj.length === +obj.length) { 
     for (var i = 0, length = obj.length; i < length; i++) { 
     if (iterator.call(context, obj[i], i, obj) === breaker) return; 
     } 
    } else { 
     var keys = _.keys(obj); 
     for (var i = 0, length = keys.length; i < length; i++) { 
     if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return; 
     } 
    } 
    return obj; 
    }; 

在underscore.js中实现_.each方法时,循环变量设置如下。for循环中的循环变量声明样式

for (var i = 0, length = obj.length; i < length; i++) 

为什么显式声明了长度变量?,是不是下面的代码更简洁?

for (var i = 0; i < obj.length; i++) 
+0

它更简洁但效率更低。在第二个循环中,每次迭代都会提取'obj.length'。首先,你只是检查一个设定值。 – ChicagoRedSox

回答

3

有宣布独立的length可变几个可能的原因:

  1. 在其自己的变量本地缓存它可以比通过循环每次引用它作为一个属性更快。

  2. 在某些情况下,数组长度可能会在迭代期间增长,您可能不想迭代新添加的元素。