由於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示例
1
2
3
4
5
6
7
|
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。
1
2
|
fun.call(
null
);
// window or global
fun.call(undefined);
// window or global
|
這在ECMAScript5.1 15.3.4.4中有解釋,如下
嚴格模式下情況又有所不同,ES3比較寬容盡量去揣測代碼意圖。ES5嚴格模式(ie6/7/8/9除外)則不再揣測,給call/apply傳入的任何參數不再轉換。如下
1
2
3
4
5
6
|
'use strict'
function
fun() {
alert(
this
);
}
fun.call(
null
)
// null
fun.call(undefined)
// undefined
|
須注意!