为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

正在回答

3 回答

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;    
				},


0 回复 有任何疑惑可以回复我~
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;

},

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

1 回复 有任何疑惑可以回复我~

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

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

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信