標籤:
由於ECMA提供遍曆數組的方法forEach()只能遍曆一維數組,沒有提供迴圈遍曆多維陣列的方法,所以我們自己來實現一個each()方法,來遍曆多維陣列。
<script charset=utf-8 type=text/javascript>
/*var arr = [1,2,3,[4,[5]]];
arr.forEach(function(item,index,arr){
alert(item);
});
*/
//類比ECMA forEach 迴圈遍曆多維陣列
var arr = [1,2,3,[4,[5,[6,[7]]]]];
//使用原型,可以擴充項物件的屬性和方法
Array.prototype.each = function (fn){
try{
//計數器
this.i || (this.i=0);
//判斷數組的長度必須大於0 && 傳進來的必須是一個函數 才進行迴圈遍曆操作
if(this.length > 0 && fn.constructor == Function){
while(this.i < this.length){
//擷取數組的每一項
var e = this[this.i];
//如果取到了數組的每一項 && 該項仍為數組 則進行遞迴操作
if(e && e.constructor == Array){
e.each(fn);
}else{
//如果取到了數組的每一項 && 該項不為數組 則執行fn函數 列印出數組的每一項
fn.call(e,e);//不懂 (看下面講解或者見連結) http://www.cnblogs.com/snandy/archive/2012/03/01/2373243.html
}
//使i遞增
this.i++;
}
//最後把i置為空白,記憶體回收機制 回收
this.i = null;
}
}catch(ex){
}
//返回當前對象
return this;
}
//forEach()方法 的參數是一個函數 並且函數內有參數,這裡我們就把函數內的參數設為一個
arr.each(function(item){
alert(item);
});
</script>
————————————————————分割線 call參數——————————————————————call和apply的第一個參數是null/undefined時函數內的的this指向window或global
call/apply用來改變函數的執行內容(this),它們的第一個參數thisArg是個對象,即作為函數內的this。
多數時候你傳啥函數內就是啥。僅以call樣本
| 1234567 |
function fun() { alert(this);}fun.call(1);fun.call(‘a‘);fun.call(true);fun.call({name:‘jack‘}); |
分別彈出“1”、“a”、“true”、“[object Object]”。
有兩種情況需要注意,傳null或undefined時,將是JS執行環境的全域變數。瀏覽器中是window,其它環境(如node)則是global。
| 12 |
fun.call(null); // window or globalfun.call(undefined); // window or global |
這在ECMAScript5.1 15.3.4.4中有解釋,如下
strict 模式下情況又有所不同,ES3比較寬容盡量去揣測代碼意圖。ES5strict 模式(ie6/7/8/9除外)則不再揣測,給call/apply傳入的任何參數不再轉換。如下
| 123456 |
‘use strict‘function fun() { alert(this);}fun.call(null) // nullfun.call(undefined) // undefined |
須注意!
javascript增加Array的each方法 迴圈遍曆多維陣列