zoukankan      html  css  js  c++  java
  • javascript-匿名函数、闭包应用(3).

    模仿块级作用域

     1 function box()
     2         {
     3             //包含在我执行的匿名函数,就可以实现私有作用域
     4             (function()                        
     5             {
     6                 for(var i=0 i<5; i++) 
     7                 {                            
     8                     alert(i);
     9                 }   
    10                             //这里面使用的变量
    11             })();            //出了这里被销毁了
    12             
    13             alert(i);
    14         }
    15         
    16         box();

    这里就是全局的私有作用域

    1 (function()
    2         {
    3             var age =100;
    4             alert(age);
    5         })();
    6         alert(age);

    私有变量

     1 //首先私有变量是没有办法访问的
     2         function box()
     3         {
     4             var age = 100;   //私有变量,外部无法访问
     5         }
     6         alert(age);
     7         
     8         //但是属性和方法是公有的
     9         function Box()
    10         {
    11             this.age=100;                    //属性,公有的
    12             this.run=function()                //方法,公有的
    13             {
    14                 return '运行中...'; 
    15             }
    16         }
    17      
    18         var box1=new Box();
    19         alert(box1.age);
    20         alert(box1.run());

    ★★私有变量私有函数 怎么通过一个公共的方法访问[其实就是利用 作用的关系(词法作用域)嵌套方法内可以访问到 变量 ,方法又是共有的特性来实现]

     1 function Box()
     2         {
     3             //私有变量
     4             var age=100;
     5             var num='Jack';
     6             
     7             //私有函数
     8             function run()                
     9             {
    10                 return num+'运行中...'; 
    11             }
    12             
    13             this.publicGo = function()       //对外可见的公共接口,特权方法
    14             {
    15                 return age+run();
    16             }
    17             this.getAge=function()
    18             {
    19                 return age;
    20             }
    21         }
    22         
    23         var box= new Box();
    24         alert(box.publicGo());                //100Jack运行中...

    ★★通过 构造函数传递参数

     1 function Box(value)
     2         {
     3             var user=value;
     4             this.getUser =function()
     5             {
     6                 return user;
     7             }
     8             this.setUser=function(value1)
     9             {
    10                 user=value1;
    11             }
    12         }
    13         
    14         var box =new Box('Lee');
    15         alert(box.getUser());
    16         box.setUser('OOO');            //可以设置
    17         alert(box.getUser());

    ----但问题是 匿名函数会被多次创建 不是共享解决如下

    ★★块级作用域访问 静态私有变量 私有函数

     1 (function()
     2         {
     3             var user ='';           //私有变量
     4             Box=function(value)        //Box 没有var 所以是全局,构造函数
     5             {
     6                 user =value;
     7             };
     8             Box.prototype.getUser=function()
     9             {
    10                 return user;
    11             }
    12             Box.prototype.setUser=function(value)
    13             {
    14                 user =value;
    15             }
    16             
    17         })();
    18     
    19         var box= new Box('LEE');
    20         alert(box.getUser());            // LEE
    21         
    22         var box2=new Box('KKK');
    23         alert(box.getUser());            // KKK
    24         
    25         box2.getUser('OOOO');
    26         alert(box.getUser());            // OOOO
    27         
    28         //ps:使用了prototype导致方法共享了,而user也就变成静态属性了。(所谓静态属性,即共享于不同对象中的属性)

    ★★★★模块模式-简单提下

    1 //什么叫 单例,就是永远只实例化一次,其实就是字面量对象声明方式
    2 
    3         var box = {          //第一次实例化,无法第二次实例化,那么就是单例
    4             user='lee',
    5             run:function()
    6             {
    7                 return '远行中...';
    8             }
    9         }
     1 //私有化变量和函数
     2 var box=function()
     3         {
     4             var user ='lee';               //私有变量
     5             function run()                //私有函数
     6             {
     7                 return '运行中';
     8             }
     9             
    10             return{                       //这里就是对外特权方法
    11                 publicGo:function() 
    12                 {
    13                     return user +run();
    14                 }
    15             };
    16             /*
    17             var obj={                       //这里就是对外特权方法
    18                 publicGo:function() 
    19                 {
    20                     return user +run();
    21                 }
    22             }
    23             return obj;
    24             */    
    25         }();
    26         
    27         alert(box.publicGo());
     1 //字面量对象声明,其实在设计模式中可以看做是一种单例模式,所谓但例模式,就是永远保持度对象的一个实例
     2 //如果我想返回自定义的 构造函数[Box , Desk]?
     3 function Desk (){};
     4     
     5     var box=function()
     6         {
     7             var user ='lee';           //私有变量
     8             function run()                //私有函数
     9             {
    10                 return '运行中';
    11             }
    12             var desk =new Desk();        // 返回自定义的构造函数 实例 
    13               desk.publiGo=function()
    14               {
    15                   return user +run();
    16               }              
    17             
    18             return desk;
    19         
    20         }();
    21     
    22         alert(box.publicGo());
  • 相关阅读:
    java动态注册Filter,Servlet,Listener
    java防止html脚本注入
    java中常用的几种跨域方式
    backbone 要点知识整理
    创建对象-constructor丢失的问题
    css3 动画(animation)-简单入门
    sass安装
    sass安装步骤
    javascript how sort() work
    javascript 获取调用属性的对象
  • 原文地址:https://www.cnblogs.com/VanqusherCsn/p/4317063.html
Copyright © 2011-2022 走看看