美文网首页
javascript 闭包得理解与使用

javascript 闭包得理解与使用

作者: jb3d | 来源:发表于2018-12-21 23:56 被阅读4次

1.源于js的一条规则:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。

2.为了解决问题1,利用js的另一个特点:"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。可以在函数F1里面声明一个函数F2,这样函数F2就被包括在函数F1内部,这时F1内部的所有局部变量,对F2都是可见的。既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!

3.由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

4.封装

var people = function() {}(

//变量作用域为函数内部,外部无法访问

var name = "defalut";

return {

      getName : function(){   

          return name;   

      },   

      setName : function(newName){   

          name = newName;   

      }   

    }   

);

print(person.name);//直接访问,结果为undefined 

 print(person.getName());

person.setName("abruzzi");   

print(person.getName());

得到结果如下: 

undefined  

default 

abruzzi 

5.实现类和继承

function Person(){

    varname = "default";     

    return {   

      getName : function(){   

          return name;   

      },   

      setName : function(newName){   

          name = newName;   

      }   

    }   

    }; 

    varp =new Person();

    p.setName("Tom");    alert(p.getName());

varJack =function(){};

    //继承自PersonJack.prototype =new Person();

    //添加私有方法Jack.prototype.Say =function(){

        alert("Hello,my name is Jack");

    };

    varj =new Jack();

    j.setName("Jack");

    j.Say();

    alert(j.getName());

我们定义了Person,它就像一个类,我们new一个Person对象,访问它的方法。

下面我们定义了Jack,继承Person,并添加自己的方法

相关文章

网友评论

      本文标题:javascript 闭包得理解与使用

      本文链接:https://www.haomeiwen.com/subject/pbebkqtx.html