javaScript -匿名函数

一、匿名函数:没有函数名;单独的匿名函数是无法运行的,可通过把匿名函数赋值给变量来运行。

var dd = (function(){
         return 'jack';
 })();
 alert(dd);// jack

二、块级作用域(私有作用域):

     function box(){

         {//for:块级作用域: 出了for的范围,i值未被销毁,而且不会被后面的重复声明覆盖掉           
         for (var i=0; i < 5; i++)         

     };
         var i ; //但重新给i赋值则会覆盖掉原来的值
         alert(i); //还是返回5:重新声明后值不会变
     }

   //使用块级作用域: 即使i出了块级作用域后就销毁
    function box(){
        (function(){//用包含自我执行的匿名函数来实现块级作用域
           for(var i=0; i<5; i++){
            alert(i);//变量i出了匿名函数后即被销毁
        }
        })();
        alert(i);//出了匿名函数,i会不被识别
    }

块级作用域用处:代替全局作用域。

//使用块级作用域实现,防止变更污染,不会有内存占用问题:匿名函数执行完就被销毁了
    (function(){
        var age = 150;
        alert(age);
    })();
    alert(age);// 报未定义错误,说明 age在全局作用域中不会被访问到

三、私有属性(私有变量)

私有化运行机制:方式1:特权方法实现

function Box(){
        var age = 100; //私有属性
        function run(){ //私有方法
           return '运行中....'; 
        };
        this.publicMethod = function(){//外部 可以访问的公共接口(特权方法)
            return age + run();
        };
    }
    var box = new Box();

    //可以访问到函数内部私有的属性和方法
    alert(box.publicMethod());

私有化运行机制:方式2:构造方法传参实现

function Desk(value){
        var user = value; //私有变量
        this.getUser = function(){//方法不会共享
            return user;
        };
        this.setUser = function(value){//可通过特权方法实现赋值
           user = value; 
        };
    }
    var d1 = new Desk('Lee');
    var d2 = new Desk('kkk');
    alert(d1.getUser());//返回Lee
    alert(d2.getUser());//返回kkk

私有化运行机制:方式3:通过静态私有属性实现(即可以被不同的实例共享的属性):

(function (){ //匿名函数内部的构造函数外部无法访问,需将其设为全局变量方可
           var user = ""; //私有变量
           // Box = function(value){// 不加var,创建一个全局的构造 函数,使得外面可以访问
               // user = value;
               // this.getUser = function(){
                   // return user;
               // };
           // }; //一般不通过此方法共享
          
           Box = function(value){// 一般通过原型来实现静态私有属性的访问,且属性是共享的
               user = value;
           };
           Box.prototype.getUser = function(){
               return user;
           };
           Box.prototype.setValue = function(value){
               user = value;
           };
       })();
      var b1 = new Box('lee');
      var b2 = new Box('kkkk');
      alert(b1.getUser());//返回lee
      alert(b2.setUser('oooo'));
      alert(b1.getUser());//此时会返回ooo, 因为是共享的

猜你喜欢

转载自kstgjfk403.iteye.com/blog/2298798