日期:2014-05-16  浏览次数:20420 次

jquery 的 each 是阻塞式的吗?
比如有这个代码
var x=[];
var res=0;
for(var i=0;i<100000;i++){
x[i]=i;
}
$.each(x,function(i){
res=i;
});
alert(res);


我这里测试他每次都是99999 也就是先each完毕 才会 alert
那么 是否当each的fun里 足够慢的时候 就会出现 先alert 后才执行完each呢?
j jquery each 阻塞

------解决方案--------------------
不会。。each遍历和for语句遍历差不多,只是增加了回调的执行

// args is for internal usage only
each: function( obj, callback, args ) {
var name,
i = 0,
length = obj.length,
isObj = length === undefined 
------解决方案--------------------
 jQuery.isFunction( obj );

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

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

return obj;
},

------解决方案--------------------
js是直线形运行脚本。fun里再慢也得它运行完,直到卡死。
只有在ajax设置异步时才会分开执行
------解决方案--------------------
each里面其实还是for循环,只不过加了个回调函数而已
------解决方案--------------------
callback而已,不过单线程是一定的
------解决方案--------------------
你把alert写在了callback的外面,当然是each之后才alert一次了。
var res=0;
for(var i=0;i<100;i++){
x[i]=i;
}
$.each(x,function(i){
res=i;
alert(res);
});