callback.apply(obj[i], args)这样写有问题

来源:2-11 jQuery的each迭代器

慕雪5194257

2016-08-12 15:16

如果这样写,在回调函数中,只有通过this去取值了,。应该写成callback.apply(obj[i], i, obj[i], args)

写回答 关注

3回答

  • 慕慕7300641
    2018-07-27 11:18:45
    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;    
    				},


  • 慕慕7300641
    2018-07-27 11:18:08
    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;

    },

    源码里面有两个,教程里面是带有第三方参数的

  • 哑剧
    2016-09-01 17:35:26

    apply 和 call 第一个参数都是指代的是 callback 函数中 this 环境。

    如果按照你的写法:callback.apply(obj[i], args)。this 指向obj[i]没有意义。

jQuery源码解析(架构与依赖模块)

由浅入深地剖析jQuery库的设计与实现,揭开框架背后的秘密

84047 学习 · 280 问题

查看课程

相似问题