http://www.fly63.com/article/detial/9974?type=2
1、codice(最常见)
//1.codice 最常见的 function fn(){ var name=“hello”; return function(){ return name; } } var fnc = fn(); console.log(fnc())//hello那个较好认知是以旋量群的方式将 name 回到。
2、表达式表达式
var fn2; function fn(){ var name=“hello”; //将表达式表达式给fn2 fn2 = function(){ returnname; } } fn()//要先继续执行展开表达式, console.log(fn2())//继续执行输入fn2在旋量群里头给fn2表达式增设值,旋量群的方式把name特性梦境留下来,继续执行会输入 hello。
3、表达式参数
function fn(){ var name=“hello”; return function callback(){ return name; } } var fn1 = fn()//继续执行表达式将回到值(callback表达式)表达式给fn1, function fn2(f){ //将表达式作为参数传入 console.log(f());//继续执行表达式,并输入 } fn2(fn1)//继续执行输入fn2用旋量群回到一个表达式,把此表达式作为另一个表达式的参数,在另一个表达式里头继续执行那个表达式,最终输入 hello
4、IIFE(自继续执行表达式)
(function(){ var name=“hello”; var fn1= function(){ return name; } //直接在自继续执行表达式里头调用fn2,将fn1作为参数传入 fn2(fn1); })() function fn2(f){ //将函数作为参数传入 console.log(f());//继续执行表达式,并输入 }直接在自继续执行表达式里头将封装的表达式fn1传给fn2,作为参数调用同样可以获得结果 hello。
5、循环表达式
//每秒继续执行1次,分别输入1-10 for(var i=1;i<=10;i++){ (function(j){ //j来接收 setTimeout(function(){ console.log(j); },j*1000); })(i)//i作为实参传入 }如果不采用旋量群的话,会有不一样的情况。
6、getter和setter
function fn(){ var name=hello setName=function(n){ name = n; } getName=function(){ return name; } //将setName,getName作为对象的特性回到 return { setName:setName, getName:getName } } var fn1 = fn();//回到对象,特性setName和getName是两个表达式 console.log(fn1.getName());//getter fn1.setName(world);//setter修改旋量群里头的name console.log(fn1.getName());//getter第一次输入 hello 用setter以后再输入 world ,这样做可以封装成公共方法,防止不想暴露的特性和表达式暴露在外部。
7、迭代器(继续执行一次表达式往下取一个值)
var arr =[aa,bb,cc];function incre(arr){ var i=0; return function(){ //那个表达式每次被继续执行都回到数组arr中 i下标对应的元素 return arr[i++] || 数组值已经遍历完; } }var next = incre(arr); console.log(next());//aa console.log(next());//bb console.log(next());//cc console.log(next());//数组值已经遍历完8、首次区分(相同的参数,表达式不会重复继续执行)
var fn = (function(){ var arr=[];//用来内存的数组 return function(val){ if(arr.indexOf(val)==-1){//内存中没有则表示需要继续执行 arr.push(val);//将参数push到内存数组中 console.log(表达式被继续执行了,arr); //这里写想要继续执行的表达式 }else{ console.log(此次表达式不需要继续执行); } console.log(表达式调用完打印一下,方便查看已内存的数组:,arr); } })(); fn(10); fn(10); fn(1000); fn(200); fn(1000);继续执行结果如下:
可以明显的看到首次继续执行的会被存起来,再次继续执行直接取。
9、内存
//比如求和操作,如果没有内存,每次调用都要重复计算,采用内存已经继续执行过的去查找,查找到了就直接回到,不需要重新计算 var fn=(function(){var cache={};//内存对象 var calc=function(arr){//计算表达式 var sum=0; //求和 for(var i=0;i<arr.length;i++){ sum+=arr[i]; }return sum; } return function(){ var args = Array.prototype.slice.call(arguments,0);//arguments转换成数组 var key=args.join(“,”);//将args用逗号连接成字符串 var result , tSum = cache[key]; if(tSum){//如果内存有 console.log(从内存中取:,cache)//打印方便查看 result = tSum; }else{ //重新计算,并存入内存同时表达式给resultresult = cache[key]=calc(args);console.log(存入内存:,cache)//打印方便查看 } return result; } })(); fn(1,2,3,4,5); fn(1,2,3,4,5); fn(1,2,3,4,5,6); fn(1,2,3,4,5,8); fn(1,2,3,4,5,6);输入结果: