• JavaScript立即执行函数学习


    1.新建对象,方法内变量作用域理解错误

            var md1 = {
                count: 0,
                add: function () {
                    count++;
                },
                sub: function () {
                    count--;
                },
                show: function () {
                    console.log(count);
                }
            };
    
            md1.add();
            md1.add();
            md1.show();

    在不加this的情况之下,会试图与当前对象的作用域内寻找count。如果硬要这样写,就必须加入一个全局变量(或者在上级作用域内有count)count,如下。

            var count = 100;
            var md1 = {
                count: 0,
                add: function () {
                    count++;
                },
                sub: function () {
                    count--;
                },
                show: function () {
                    console.log(count);
                }
            };
    
            md1.add();
            md1.add();
            md1.show();

    当然,正确的方法是如下这样。

            var md1 = {
                count: 0,
                add: function () {
                    this.count++;
                },
                sub: function () {
                    this.count--;
                },
                show: function () {
                    console.log(this.count);
                }
            };
    
            md1.add();
            md1.add();
            md1.show();

    但是这样也不好,会暴露count这个理应是私有的成员,可直接在外部代码之中修改count,如下

            var md1 = {
                count: 0,
                add: function () {
                    this.count++;
                },
                sub: function () {
                    this.count--;
                },
                show: function () {
                    console.log(this.count);
                }
            };
    
            md1.add();
            md1.add();
            md1.count = 100;
            md1.sub();
            md1.add();
            md1.show();

    2.立即执行函数式,这种方式可以屏蔽count

            var md1 = (function () {
                var count = 0;
                var add = function () {
                    count++;
                };
                var sub = function () {
                    count--;
                };
                var show = function () {
                    console.log(count);
                };
                return {
                    add: add,
                    sub: sub,
                    show: show
                };
            })();
    
            md1.add();
            md1.add();
            md1.count = 100;
            md1.sub();
            md1.add();
            md1.show();

    3.放大模式,用于向已有模块里面添加新的公共成员

            var md1 = (function () {
                var count = 0;
                var add = function () {
                    count++;
                };
                var sub = function () {
                    count--;
                };
                var show = function () {
                    console.log(count);
                };
                return {
                    add: add,
                    sub: sub,
                    show: show
                };
            })();
    
            var md2 = (function (md) {
                md.add2 = function () {
                    md.add();
                    md.add();
                };
                return md;
            })(md1);
    
            md1.add();
            md1.add();
            md1.sub();
            md2.add2();
            md1.show();
            md2.show();

    4.宽放大模式

            var md1 = (function () {
                var count = 0;
                var add = function () {
                    count++;
                };
                var sub = function () {
                    count--;
                };
                var show = function () {
                    console.log(count);
                };
                return {
                    add: add,
                    sub: sub,
                    show: show
                };
            })();
    
            var md2 = (function (md) {
                md.add2 = function () {
                    md.add();
                    md.add();
                };
                return md;
            })(md1 || {});
    
            md1.add();
            md1.add();
            md1.sub();
            md2.add2();
            md1.show();
            md2.show();

    独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互。

    为了在模块内部调用全局变量,必须显式地将其他变量输入模块。

      var module1 = (function ($, YAHOO) {

        //...

      })(jQuery, YAHOO);

    上面的module1模块需要使用jQuery库和YUI库,就把这两个库(其实是两个模块)当作参数输入module1。这样做除了保证模块的独立性,还使得模块之间的依赖关系变得明显。这方面更多的讨论,参见Ben Cherry的著名文章《JavaScript Module Pattern: In-Depth》

    这个系列的第二部分,将讨论如何在浏览器环境组织不同的模块、管理模块之间的依赖性。

  • 相关阅读:
    网络存储系统NSS基准性能测试(7.10)
    Design and Model Analysis of the ECommerce Development Platform for 3Tiered Web Applications
    网络存储系统NSS基准性能测试(7.24)
    Android雁翎刀之ImageView之哈哈镜
    Android雁翎刀之ImageView之舞动乾坤
    Android雁翎刀之ImageView之异步下载
    网络存储系统NSS基准性能测试(7.17)
    freeradius源码安装及相关问题解释
    解决linux乱码显示的问题
    在ubtunu使用aptget安装和配置freeradius
  • 原文地址:https://www.cnblogs.com/jimaojin/p/7650046.html
Copyright © 2020-2023  润新知