zoukankan      html  css  js  c++  java
  • 全面理解Javascript闭包和闭包的几种写法及用途

    var Circle={
    "PI":3.14159,
    "area":function(r){
    return this.PI * r * r;
    }
    };
    alert( Circle.area(1.0) );

    匿名自执行函数
    var data= {
    table : [],
    tree : {}
    };

    (function(dm){
    for(var i = 0; i < dm.table.rows; i++){
    var row = dm.table.rows[i];
    for(var j = 0; j < row.cells; i++){
    drawCell(i, j);
    }
    }

    })(data);

    结果缓存[闭包正是可以做到这一点,因为它不会释放外部的引用,从而函数内部的值可以得以保留。]
    var CachedSearchBox = (function(){
    var cache = {},
    count = [];
    return {
    attachSearchBox : function(dsid){
    if(dsid in cache){//如果结果在缓存中
    return cache[dsid];//直接返回缓存中的对象
    }
    var fsb = new uikit.webctrl.SearchBox(dsid);//新建
    cache[dsid] = fsb;//更新缓存
    if(count.length > 100){//保正缓存的大小<=100
    delete cache[count.shift()];
    }
    return fsb;
    },

    clearSearchBox : function(dsid){
    if(dsid in cache){
    cache[dsid].clearSelection();
    }
    }
    };
    })();

    CachedSearchBox.attachSearchBox("input");
    3、封装
    var person = function(){
    //变量作用域为函数内部,外部无法访问
    var name = "default";

    return {
    getName : function(){
    return name;
    },
    setName : function(newName){
    name = newName;
    }
    }
    }();

    print(person.name);//直接访问,结果为undefined
    print(person.getName());
    person.setName("abruzzi");
    print(person.getName());
    4、实现类和继承
    function Person(){
    var name = "default";

    return {
    getName : function(){
    return name;
    },
    setName : function(newName){
    name = newName;
    }
    }
    };

    var p = new Person();
    p.setName("Tom");
    alert(p.getName());

    var Jack = function(){};
    //继承自Person
    Jack.prototype = new Person();
    //添加私有方法
    Jack.prototype.Say = function(){
    alert("Hello,my name is Jack");
    };
    var j = new Jack();
    j.setName("Jack");
    j.Say();
    alert(j.getName());

    来源:http://www.cnblogs.com/yunfeifei/p/4019504.html

  • 相关阅读:
    Linux基础命令---sudo
    Linux基础命令---yes
    Linux基础命令---shutdown
    Divide Two Integers
    java 判断两个数是否异号
    字节顺序的详细解释(转)
    java无符号移位(>>>)和有符号移位(>>)
    java 参数化类型
    c++事件内核对象(event)进程间激活(转)
    windows多线程编程(一)(转)
  • 原文地址:https://www.cnblogs.com/jayruan/p/5095533.html
Copyright © 2011-2022 走看看