<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width;initial-scale=1.0;user-scalable=no">
<title>数组filter等和arguments结合闭包实现函数复用</title>
</head>
<body>
<script>
var numArr = [1,2,3,4,5,6];
//下面是自定义多种过滤函数,除了可以用于filter,还可以用于map, forEach, sort等
//通常使用filter函数,我们都是直接使用 array.filter(function(item,index,array){
//do something
//})
//这样不利于函数对象复用,下面会结合arguments来实现对filter函数的复用
function morethan(){
//获取用户传入的第一个参数值,作为比较基数
var num = arguments[0];
//下面这个myfn函数,是filter真正作用的函数
var myfn = function(){
var item = arguments[0];
//由于内部函数可以访问父作用域内的变量,所以num的值可以获得
return (item>num)
}
//下面是返回函数对象的引用(其实指针更合适),这里可以说是实现了闭包
//但是我认为不如理解成当这个外部函数执行完毕,由于对内部函数产生的
//引用指针还在最外部的环境里起作用没被回收,所以导致内部函数对象能够持续访问
return myfn;
}
//下面这个等价于 numArr.filter(function(item,index,array,num){})
var filterArr = numArr.filter(morethan(4));
alert(filterArr);
</script>
</body>
</html>