javascript增加Array的each方法 循环遍历多维数组
由于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 |
须注意!
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。