请记住 – jQuery只是JavaScript。不要以为它有能力来补偿你糟糕的代码。
这意味着,正如我们必须优化JavaScript for语句一样,我们必须优化jQuery的
each
方法。
02 | each: function ( object, callback, args ) { |
04 | length = object.length, |
05 | isObj = length === undefined || jQuery.isFunction(object); |
09 | for ( name in object ) { |
10 | if ( callback.apply( object[ name ], args ) === false ) { |
15 | for ( ; i < length; ) { |
16 | if ( callback.apply( object[ i++ ], args ) === false ) { |
25 | for ( name in object ) { |
26 | if ( callback.call( object[ name ], name, object[ name ] ) === false ) { |
31 | for ( var value = object[0]; |
32 | i < length &amp;amp;amp;&amp;amp;amp; callback.call( value, i, value ) !== false ; value = object[++i] ) {} |
糟糕的代码:
1 | someDivs.each( function () { |
2 | $( '#anotherDiv' )[0].innerHTML += $( this ).text(); |
- 在每一次遍历循环中都会搜寻anotherDiv 这个ID的元素
- 两次获取innerHTML属性
- 创建了一个jQuery对象,只是为了获取元素的text属性
优化的代码:
1 | var someDivs = $( '#container' ).find( '.someDivs' ), |
4 | someDivs.each( function () { |
5 | contents.push( this .innerHTML ); |
7 | $( '#anotherDiv' ).html( contents.join( '' ) ); |
这样,在
each
(for)方法,我们唯一要执行任务的关键是增加一个新的到一个数组…而不是查询DOM中,取代了元素两次获取innerHTML属性等。