要求:
一、只能在指定的位置填写本身的代码,本文件里的其余代码不能修改
二、全部题目都不容许添加全局变量名
三、本文件应该能在firebug的console里正常执行,并输出结果
四、代码最优化,效率最高
五、代码注释明确json
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.直接调用传入参数就行了.*/ }; } }