慕雪5194257
2016-08-12 15:16
如果这样写,在回调函数中,只有通过this去取值了,。应该写成callback.apply(obj[i], i, obj[i], args)
each: function(obj, callback, args) { var value, i = 0, length = obj.length, isArray = isArraylike(obj); // 判断是不是数组 // 传了第三个参数 if (args) { if (isArray) { for (; i < length; i++) { // 相当于: // args = [arg1, arg2, arg3]; // callback(args1, args2, args3)。然后callback里边的this指向了obj[i] value = callback.apply(obj[i], args); if (value === false) { // 注意到,当callback函数返回值会false的时候,注意是全等!循环结束 break; } } // 非数组 } else { for (i in obj) { value = callback.apply(obj[i], args); if (value === false) { break; } } } // A special, fast, case for the most common use of each } else { // 数组 // 其实这里代码有点赘余,如果考虑代码的简洁性牺牲一点点性能 // 在处理数组的情况下,也是可以用 for(i in obj)的 if (isArray) { for (; i < length; i++) { // 相当于callback(i, obj[i])。然后callback里边的this指向了obj[i] value = callback.call(obj[i], i, obj[i]); if (value === false) { break; } } // 非数组 } else { for (i in obj) { value = callback.call(obj[i], i, obj[i]); if (value === false) { break; } } } } return obj; },
each: function(obj, callback, args) { | |
var value, | |
i = 0, | |
length = obj.length, | |
isArray = isArraylike(obj); // 判断是不是数组 | |
// 传了第三个参数 | |
if (args) { | |
if (isArray) { | |
for (; i < length; i++) { | |
// 相当于: | |
// args = [arg1, arg2, arg3]; | |
// callback(args1, args2, args3)。然后callback里边的this指向了obj[i] | |
value = callback.apply(obj[i], args); | |
if (value === false) { | |
// 注意到,当callback函数返回值会false的时候,注意是全等!循环结束 | |
break; | |
} | |
} | |
// 非数组 | |
} else { | |
for (i in obj) { | |
value = callback.apply(obj[i], args); | |
if (value === false) { | |
break; | |
} | |
} | |
} | |
// A special, fast, case for the most common use of each | |
} else { | |
// 数组 | |
// 其实这里代码有点赘余,如果考虑代码的简洁性牺牲一点点性能 | |
// 在处理数组的情况下,也是可以用 for(i in obj)的 | |
if (isArray) { | |
for (; i < length; i++) { | |
// 相当于callback(i, obj[i])。然后callback里边的this指向了obj[i] | |
value = callback.call(obj[i], i, obj[i]); | |
if (value === false) { | |
break; | |
} | |
} | |
// 非数组 | |
} else { | |
for (i in obj) { | |
value = callback.call(obj[i], i, obj[i]); | |
if (value === false) { | |
break; | |
} | |
} | |
} | |
} | |
return obj; | |
}, |
源码里面有两个,教程里面是带有第三方参数的
apply 和 call 第一个参数都是指代的是 callback 函数中 this 环境。
如果按照你的写法:callback.apply(obj[i], args)。this 指向obj[i]没有意义。
jQuery源码解析(架构与依赖模块)
84047 学习 · 280 问题
相似问题