函数是一种能被调用的对象
对象具有的特征,在js中的函数都具备。而且js中的函数还具备对象不具备的特征,那就是调用。
- 通过字面量创建
- 赋值给变量,数组项或其他对象的属性
- 可以作为函数的参数来传递。(回调)
- 可以作为函数的返回值。(闭包)
- 函数可以动态添加属性。(典型用例,缓存)
回调函数
回调产生的前提:函数作为参数传到另一个函数中。
重要的回调例子:处理事件、简单的排序集合
例子:主要来看数组排序
var values = [0, 3, 2, 5, 7, 4, 8, 1]; values.sort(function(value1, value2) { return value1- value2; });
函数可以添加属性
例子1:为集合中添加功能不重复的函数
注:本例子通过给函数贴标签的形式来判断函数是否被添加。还有一方面就是缓存的问题,这里的缓存是对象和 函数合作的结果
var store = { cache: {}, add: function(fn,name) { if (fn[name]==undefined) { //console.log(this); fn.name = name; this.cache[name]= fn; return true; } else { return false; } } }; function ninja(){console.log("你是谁,我是张大里胡茬")} function zhangsan(){console.log("我叫张三,我是来做测试的,我是小白鼠")} function lisi(){console.log("哼,我叫李四,我是来体验生活的,生活如此美好")} store.add(ninja,"ninja"); store.add(lisi,"lisi"); store.add(lisi,"lisi"); store.add(zhangsan,"zhangsan"); store.cache.ninja();
例子2:缓存(这里很妙)
function isPrime(value) { if (!isPrime.answers) { isPrime.answers = {}; } if (isPrime.answers[value] !== undefined ) { //检查传入的数据是否已经缓存。如果缓存了,就不会继续执行,return,并且将值给出 //如果没有缓存则继续向下走进行计算,将计算过后的值给出 return isPrime.answers[value]; } var prime =value!==0 && value !== 1; for (var i = 2; i < value; i++) { if (value % i === 0) { prime = false; break; } } return isPrime.answers[value] = prime; } isPrime(5)//此函数确认一个数是否是素数
例子3:记录函数函数执行次数
function isPrime() { if (isNaN(isPrime.num)) { isPrime.num=0; }else{ isPrime.num++; } } isPrime(); isPrime(); isPrime();