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

    浏览器没那么聪明!
  • 相关阅读:
    MySql和oracle的不同
    Session的有效期设置
    WebSocket和WebRtc的一些心得
    Spring事务管理
    Tomcat下使用war包发布项目
    Log4j记日志功能
    javascript typeof和instanceof
    js模块化的意义
    有关call和apply的理解。
    h5滑动插件(包含幻灯片滑动逻辑)
  • 原文地址:https://www.cnblogs.com/rulee/p/2422802.html
Copyright © 2011-2022 走看看