zoukankan      html  css  js  c++  java
  • 匿名函数和闭包

    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())
  • 相关阅读:
    Android开发之漫漫长途 XVII——动画(续)
    Android开发之漫漫长途 XVII——动画
    Android开发之漫漫长途 XVI——ListView与RecyclerView项目实战
    Android开发之漫漫长途 XV——RecyclerView
    Android开发之漫漫长途 XIV——ListView
    .net core 发布IIS502错误
    读取加密秘钥文件失败
    MVC项目发布IIS访问不了
    a标签的onclick和href事件的区别
    文件上传
  • 原文地址:https://www.cnblogs.com/redpen/p/8641674.html
Copyright © 2011-2022 走看看