jQuery性能差异不带;每一个;

jQuery性能差异不带;每一个;,jquery,Jquery,更新添加了JSFIDLE-见文章底部 我目前有一个函数,可以重新启用屏幕上所有禁用的字段。虽然它运行得非常快(在jQuery 1.3.1中),但其实现方式与当前版本略有不同: v1.4.4 removeAttr: function( name, fn ) { return this.each(function(){ jQuery.attr( this, name, "" ); if ( this.nodeType === 1 ) {

更新添加了JSFIDLE-见文章底部


我目前有一个函数,可以重新启用屏幕上所有禁用的字段。虽然它运行得非常快(在jQuery 1.3.1中),但其实现方式与当前版本略有不同:

v1.4.4

removeAttr: function( name, fn ) {
    return this.each(function(){
        jQuery.attr( this, name, "" );
        if ( this.nodeType === 1 ) {
            this.removeAttribute( name );
        }
    });
},
v1.3.1

jQuery.each({
    removeAttr: function( name ) {
        jQuery.attr( this, name, "" );
        if (this.nodeType == 1)
            this.removeAttribute( name );
    }
}, function(name, fn){
    jQuery.fn[ name ] = function(){
        return this.each( fn, arguments );
    };
});
功能大致相同,在所有情况下都使用
.each()
来处理列表。每个的定义根本没有改变:

// args is for internal usage only
each: function( object, callback, args ) {
    var name, i = 0,
        length = object.length,
        isObj = length === undefined || jQuery.isFunction(object);

    if ( args ) {
        if ( isObj ) {
            for ( name in object ) {
                if ( callback.apply( object[ name ], args ) === false ) {
                    break;
                }
            }
        } else {
            for ( ; i < length; ) {
                if ( callback.apply( object[ i++ ], args ) === false ) {
                    break;
                }
            }
        }

    // A special, fast, case for the most common use of each
    } else {
        if ( isObj ) {
            for ( name in object ) {
                if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
                    break;
                }
            }
        } else {
            for ( var value = object[0];
                i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
        }
    }

    return object;
},
//参数仅供内部使用
每个:函数(对象、回调、参数){
变量名称,i=0,
长度=object.length,
isObj=长度===未定义的| | jQuery.isFunction(对象);
如果(args){
if(isObj){
for(对象中的名称){
if(callback.apply(对象[名称],参数)==false){
打破
}
}
}否则{
对于(;i
所以只需多次使用
.call()
循环即可


我认为关于速度增加的唯一解释是增加一个额外的外部
。each()
循环是指数据结构大小在通过多层调用传递之前被大大缩减为单个元素,这可能会在每一层创建本地数据副本。通过传递整个列表来处理可能会产生更大的开销,需要分析堆的使用情况来判断。

有没有可能你能在上面写上几页吗?当你说“表现得更好”时,你能得到两个数字吗?我试过Ben J的小提琴,差别是惊人的——第二个大约快一倍:1.23秒对2.53秒。
jQuery.each({
    removeAttr: function( name ) {
        jQuery.attr( this, name, "" );
        if (this.nodeType == 1)
            this.removeAttribute( name );
    }
}, function(name, fn){
    jQuery.fn[ name ] = function(){
        return this.each( fn, arguments );
    };
});
// args is for internal usage only
each: function( object, callback, args ) {
    var name, i = 0,
        length = object.length,
        isObj = length === undefined || jQuery.isFunction(object);

    if ( args ) {
        if ( isObj ) {
            for ( name in object ) {
                if ( callback.apply( object[ name ], args ) === false ) {
                    break;
                }
            }
        } else {
            for ( ; i < length; ) {
                if ( callback.apply( object[ i++ ], args ) === false ) {
                    break;
                }
            }
        }

    // A special, fast, case for the most common use of each
    } else {
        if ( isObj ) {
            for ( name in object ) {
                if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
                    break;
                }
            }
        } else {
            for ( var value = object[0];
                i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
        }
    }

    return object;
},