码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript立即执行函数学习

时间:2017-10-11 14:04:42      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:blank   浏览器   修改   对象   func   sub()   com   module   依赖性   

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》

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

JavaScript立即执行函数学习

标签:blank   浏览器   修改   对象   func   sub()   com   module   依赖性   

原文地址:http://www.cnblogs.com/jimaojin/p/7650046.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!