zoukankan      html  css  js  c++  java
  • javascript closure闭包不能“闭开”一切

    闭包有很多的用处,本人在写js时常用闭包来隔离功能块,比如:

    var context = {};
    (function () {
        var class = function () { };
        class.prototype = { constructor: class };
        context.class1 = class;
    })();
    (function () {
        var class = function () { };
        class.prototype = { constructor: class };
        context.class2 = class;
    })();
    

    通过闭包把两个相同名称的class隔离开,并且分别以不同的key注册到context上,这样不会相互污染到,闭包内部的变量都只是在闭包内部起作用,

    当然这个是正常的使用方式,但往往存在一些非正常的使用方式,如声明变量时没有用var:

    (function () {
        myname = 'rulee';
    })();
    

    这样闭包还能正常的起到隔离的作用吗?当然不行,对js作用域有深入了解的人都知道这会使得myname变量挂接到widow对象上,污染到全局作用域,这时闭包就无能为力了,我们来做个测试:

    (function () {
        myname = 'rulee';
    })();
    (function () {
        alert(myname);
    })();
    

    运行结果alert弹出了rulee,说明第二个闭包内可以访问到第一个闭包内的myname变量,这就是问题的所在。

    进一步测试function的定义,我们知道function有两种简单的声明方式:var fn = function(){}或function fn(){}。第一中声明方式跟定义普通的变量没有什么区别,第二种就比较有意思了,它会不会想myname变量一样hold不住呢?

    (function () {
        function aa() { }
    } ());
    (function () {
        alert(aa);
    } ());
    

    测试结果:'aa' is undefined,还好这样是hold得住的。

    js是个解释性的动态语言,可以很自由随意的书写,但有很多陷阱,养成良好的书写习惯和细心很重要!

    浏览器没那么聪明!
  • 相关阅读:
    hdu 2544 Dijstra模板题
    hdu 1002 prime 模板
    POJ_2653_Pick-up sticks_判断线段相交
    POJ_1556_The Doors_判断线段相交+最短路
    POJ_1269_Intersecting Lines_求直线交点
    POJ_3304_Segments_线段判断是否相交
    POJ_2318_TOYS&&POJ_2398_Toy Storage_二分+判断直线和点的位置关系
    ZOJ_2314_Reactor Cooling_有上下界可行流模板
    LuoguP4234_最小差值生成树_LCT
    BZOJ_3996_[TJOI2015]线性代数_最大权闭合子图
  • 原文地址:https://www.cnblogs.com/rulee/p/2422802.html
Copyright © 2011-2022 走看看