zoukankan      html  css  js  c++  java
  • 复习JavaScript 4

    # 全面解析Module模式 复习
    
    ***
    ## 基本用法##
    ``` javascript
    var Calculator = function (eq) {
        //这里可以声明私有成员
    
        var eqCtl = document.getElementById(eq);
    
        return {
            // 暴露公开的成员
            add: function (x, y) {
                var val = x + y;
                eqCtl.innerHTML = val;
            }
        };
    };
    ```
    每次调用的时候new一下,**不过这样每个实例都独立存在于内存中**。
    ``` javascript
    var calculator = new Calculator('eq');
    calculator.add(2, 2);
    ```
    
    ***
    ###1、匿名闭包###
    ```javascript
    (function () {
        // ... 所有的变量和function都在这里声明,并且作用域也只能在这个匿名闭包里
        // ...但是这里的代码依然可以访问外部全局的对象
    }());
    ```
    之前说过()内的function属于函数表达式,可以执行。
    
    ###2、全局变量在模块中的使用
    * 全局变量传入模块中  
    全局变量可以作为参数传入匿名函数中
    ```javascript
    function ($, YAHOO) {
        // 这里,我们的代码就可以使用全局的jQuery对象了,YAHOO也是一样
    } (jQuery, YAHOO));
    ```
    * 模块中声明全局变量
    ```javascript
    var blogModule = (function () {
        var my = {}, privateName = "博客园";
    
        function privateAddTopic(data) {
            // 这里是内部处理代码
        }
    
        my.Name = privateName;
        my.AddTopic = function (data) {
            privateAddTopic(data);
        };
    
        return my;
    } ());
    ```
    ## 高级用法##
    ###1、松耦合扩展###
    
    >Module模式的一个限制就是所有的代码都要写在一个文件,但是在一些大型项目里,将一个功能分离成多个文件是非常重要的,因为可以多人合作易于开发。再回头看看上面的全局参数导入例子,我们>能否把blogModule自身传进去呢?答案是肯定的,我们先将blogModule传进去,添加一个函数属性,然后再返回就达到了我们所说的目的。
    ```javascript
     var blogModule = (function (my) {
    
        // 添加一些功能   
        
        return my;
    } (blogModule || {}));  
    ```
    每个文件都保证这个结构,我们就能任意顺序加载文件。**注意:var声明必须存在!**
    ***
    ###2、跨文件共享私有对象###
    让模块中不同问价可以相互访问私有对象。
    ```javascript
    var blogModule = (function (my) {
        var _private = my._private = my._private || {},
            
            _seal = my._seal = my._seal || function () {
                delete my._private;
                delete my._seal;
                delete my._unseal;
                
            },
            
            _unseal = my._unseal = my._unseal || function () {
                my._private = _private;
                my._seal = _seal;
                my._unseal = _unseal;
            };
            
        return my;
    } (blogModule || {}));
    ```
    
    >任何文件都可以对他们的局部变量_private设属性,并且设置对其他的文件也立即生效。一旦这个模块加载结束,应用会调用 blogModule._seal()"上锁",这会阻止外部接入内部的_private。如果这个    >模块需要再次增生 ,应用的生命周期内,任何文件都可以调用_unseal() ”开锁”,然后再加载新文件。加载后再次调用 _seal()”上锁”。
    ***
    感谢@汤姆大叔 的《深入理解JavaScript系列》指导我学习!
    
  • 相关阅读:
    软件测试人员的年终绩效考核怎么应对
    收藏
    顶踩组件 前后两版
    订阅组件
    hdu 1963 Investment 完全背包
    hdu 4939 Stupid Tower Defense 动态规划
    hdu 4405 Aeroplane chess 动态规划
    cf 414B Mashmokh and ACM 动态规划
    BUPT 202 Chocolate Machine 动态规划
    hdu 3853 LOOPS 动态规划
  • 原文地址:https://www.cnblogs.com/ltchronus/p/3534933.html
Copyright © 2011-2022 走看看