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

    浏览器没那么聪明!
  • 相关阅读:
    IDEA创建test测试类
    SpringBoot Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration
    Mysql在线加索引锁表归纳
    工作感悟--对上一份工作总结
    ESP8266获取网络NTP时间(转)
    Python中的CGI编程 config配置(windows、Apache) 以及后期的编写(转)
    CGI与FastCGI(转)
    JSON-RPC轻量级远程调用协议介绍及使用
    java插件化编程(动态加载)
    PF4J入门指南
  • 原文地址:https://www.cnblogs.com/rulee/p/2422802.html
Copyright © 2011-2022 走看看