菜鸟向大牛进发

博客园 首页 联系 订阅 管理

 

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

 

须注意!

posted on 2015-04-14 22:27  菜鸟向大牛进发  阅读(4641)  评论(0编辑  收藏  举报