要求:
一、只能在指定的位置填寫本身的代碼,本文件裏的其餘代碼不能修改
二、全部題目都不容許添加全局變量名
三、本文件應該能在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.直接調用傳入參數就行了.*/ }; } }