javascript增長Array的each方法 循環遍歷多維數組 call和apply的第一個參數是null/undefined時函數內的的this指向window或global

 

因爲ECMA提供遍歷數組的方法forEach()只能遍歷一維數組,沒有提供循環遍歷多維數組的方法,因此咱們本身來實現一個each()方法,來遍歷多維數組。

<script charset=utf-8 type=text/javascript>javascript

 

/*var arr = [1,2,3,[4,[5]]];html

arr.forEach(function(item,index,arr){java

alert(item);node

});數組

*/瀏覽器

//模擬ECMA forEach  循環遍歷多維數組app

 

var arr = [1,2,3,[4,[5,[6,[7]]]]];函數

 

//使用原型,能夠擴展對象的屬性和方法post

Array.prototype.each = function (fn){this

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和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

 

須注意!

相關文章
相關標籤/搜索