匿名函数和闭包

1.匿名函数

通过自我执行来执行匿名函数

1 (function(){...})()  // 前面小括号是匿名函数,后面小括号是执行

函数里面放一个匿名函数

1 function box(){
2   return function(){
3     return 'haha';  
4   }  
5 }
6 var b = box();
7 alert(b())
// alert(box()()) 不建议这么写

闭包

定义:有权访问另一个函数作用域中的变量的函数(在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量)

1. 使用匿名函数实现局部变量驻留内存中从而累加

 1 function box(){
 2     var age = 100;
 3     return function(){
 4         age++;
 5         return age;
 6     }
 7 }
 8 var b = box();
 9 aler(b());
10 aler(b());
11 aler(b());
12 aler(b());
b = null // 解除引用,等待垃圾回收

ps:由于闭包作用域返回的局部变量资源不会被立刻销毁回收,所以可能会占用更多的内存。过度使用闭包会导致性能下降,建议在非常必要的时候使用闭包

2.

 1 function box(){
 2         var arr = [];
 3         for(var i = 0; i < 5; i++){
 4             arr[i] = (function(num){
 5                 return function(){
 6                     return num;
 7                 }
 8             })(i);  // 及时执行自己
 9         }
10         return arr;
11     }
12     var b = box();
13     for(var i = 0; i < 5; i++){
14         alert(b[i]( ));
15     }

3.关于this对象(闭包不属于object,this指向window)

 1 var user = 'window'
 2 var box = {
 3     user: 'box',
 4     getUser: function(){
 5         var that = this;
 6         return function(){
 7             // return this;
 8             return that.user;
 9         }
10     }
11 }
12 // alert(box.getUser()());  // 指向window对象
13 // alert(box.getUser().call(box));  // call,通过对象冒充指向box
14 alert(box.getUser()())

 4.块级作用域(私有作用域)

 1 function box(){
 2     (function(){         // 包含自我执行的匿名函数,就可以实现私有作用域
 3         for(var i = 0;i<6;i++){
 4         alert(i);
 5         }
 6     })();       // 出了这个私有作用域,变量就会被销毁
 7     alert(i);    // 这里就不认识了
 8     
 9 }
10 box();

 5.通过原型创建共享

(function(){
        var user = '';
        Box = function(value){  // 全局,构造函数
            user = value;           
        }
        Box.prototype.getUser = function() {   // 通过原型创建一个共享地址
            return user;
        };
    })();
    var box = new Box('lee');   
    alert(box.getUser());     // lee
    var box2 = new Box('kkk');   
    alert(box.getUser())     // kkk

6.单例

var box = {   // 只实例化一次,那么就是单例
        user: 'lee',
        run: function(){
            return 'hahhaha';
        }
    }

7.字面量的方式

var box = function(){
        var age = 100;
        function run(){
            return '运行中';
        }
        // 第一种方法
        // return{   // 直接返回对象
        //     go: function(){
        //         return age+run();
        //     }
        // }
        // 第二种方法
        var obj = {
            go: function(){
                return age + run();
            }
        }
        return obj;
    }();
    alert(box.go());

8.增强的模块模式,适合返回自定义对象,也就是构造函数

function Desk(){}
    var box = function(){
        var age = 100;  // 私有变量
        function run(){   // 私有函数
            return '运行了';
        }
        var obj = new Desk();
        obj.publicGo = function(){    // 也可以将其封装在Desk里面
            return age + run();
        }
        return obj;
    }()
    alert(box.publicGo())

 

posted @ 2018-03-24 21:51  世界太小而我太大  阅读(181)  评论(0编辑  收藏  举报