请求:
1、只能在指定的位置填写本身的代码,本文件里的其他代码不能修正
2、一切问题都不许可增加全局变量名
3、本文件应当能在firebug的console里一般实行,并输出效果
4、代码最优化,效力最高
5、代码解释明白
var each = function(obj,fn){
//答题最先
//答题完毕
}
try{
var data1 = [4,5,6,7,8,9,10,11,12];
var data2 = {
"a": 4,
"b": 5,
"c": 6
};
console.group(data1);
each(data1, function(o){
if( 6 == this )
return true;
else if( 8 == this )
return false;
console.log(o + ": \"" + this + "\"");
});
console.groupEnd();
/*------[实行效果]------
1: "4"
2: "5"
4: "7"
------------------*/
console.group(data2);
each(data2, function(v, n){
if( 5 == this )
return true;
console.log(n + ": \"" + v + "\"");
});
console.groupEnd();
/*------[实行效果]------
a: "4"
c: "6"
------------------*/
}catch(e){
console.error("实行失足,错误信息: " + e);
}
本日就来处理而且讲解下上面这道题
var each = function(obj,fn){
for(var key in obj){
/*起首遍历下函数的一个参数obj,也就是data1和data2.为何要挑选for,in轮回呢?由于它既能遍历数组data1,又能遍历字典(json)data2.*/
var value = obj[key];
/*这边要相识到value,key离别是什么东西。在data1传入的时刻value是数组中各个元素,key是数组的索引。在data2传入的时刻value是值(4,5,6),key是属性(a,b,c).*/
fn1 = fn.bind(value);
/*这行代码为了第一道题所建立.依据问题console.log(o + ":" \"" + this + "\"");愿望输出的是1:"4" 2:"5" 4:"7"; 从问题输出的请求能够看出前面是数组的索引值,虽然对应的值彷佛团体少了1.还能够看出o对应索引,this对应数组的元素.由于o能直接获取到(key),this的话须要增加data1才获取到,因而我们用了bind()函数,bind函数第一个参数就是增加元素到指定函数里,指向**this**.把value增加到fn内里然后赋值给fn1.*/
if(!isNaN(key)){
/*假如key是数字的话,实行以下代码*/
var r = fn1(++key);
/*这里的fn1就是上面代码中fn绑定value(data1数组元素)后的函数,函数内里传了个参数++key。我们都晓得key是索引,然则为何要前面写上++呢,仔细的朋侪发明了,由于答案的索引值比现实索引值要多1.代码到这边,输出下r尝尝,r会把一切的索引值和对应的data1元素都给输出,还能发明除了数组元素6是返回true和8是返回false,其他都是undefined.*/
if(r === false){
break;
/*由于想要实行效果为1:"4" 2:"5" 4:"7",也就是不要包含数组元素8和对应的索引值+1背面的值.依据已有的代码当数组元素是8时返回false,只需当r恒即是false就住手背面的输出.这边已是满足第一题的答案请求了,那为何数组元素少了个6呢,仔细的朋侪已发明了,由于当数组元素即是6时,直接返回true了.*/
}
}
else{
/*假如key不是数字,实行下面这段代码.*/
fn1(value,key);
/*看console.log(n + ": \"" + v + "\""),想要实行的效果为a:"4",c:"6".左侧的属性就是key,对应参数n.右侧的属性值就是value,对应参数v.直接挪用传入参数就好了.*/
};
}
}