Javascript中的匿名函数与封装介绍


Posted in Javascript onMarch 15, 2015

迷惑了一会儿不同JS库的封装后,终于有了点头绪。大致就是:

创建一个自调用匿名函数,设计参数window,并传入window对象。

而这个过程的目的则是,
使得自身的代码不会被其他代码污染,同时也可以不污染其他代码。

jQuery 封装

于是找了个早期版本的jQuery,版本号是1.7.1里面的封装代码大致是下面这样的

(function( window, undefined ) {

var jQuery = (function() {console.log('hello');});

window.jQuery = window.$ = jQuery;

if ( typeof define === "function" && define.amd && define.amd.jQuery ) {

    define( "jquery", [], function () { return jQuery; } );

}

})( window );

其中的

console.log('hello');

是用以验证是否按开头说的这样工作,于是我们就可以在window中调用jQuery
window.$

或者是
window.jQuery

于是我们就可以创建一个类似的封装

(function(window, undefined) {

    var PH = function() {
    }

})(window)

相比于上面只是少了两步

1.定义jQuery的符号及全局调用
2.异步支持

于是找了下更早期的jQuery的封装,方法上大致是一样的, 除了。。

if (typeof window.jQuery == "undefined") {

    var jQuery = function() {};

    if (typeof $ != "undefined")

        jQuery._$ = $;
    var $ = jQuery;

};

很神奇的判断方法,以致于我们没有办法重写上一步的jQuery。于是只好看看最新的jQuery的封装是怎样的。于是就打开了2.1.1,发现除了加了很多功能以外,基本上思想还是不变的

(function(global, factory) {
    if (typeof module === "object" && typeof module.exports === "object") {

        module.exports = global.document ?

            factory(global, true) :

            function(w) {

                if (!w.document) {

                    throw new Error("jQuery requires a window with a document");

                }

                return factory(w);

        };

    } else {

        factory(global);

    }
}(typeof window !== "undefined" ? window : this, function(window, noGlobal) {

    var jQuery = function() {

        console.log('jQuery');

    };

    if (typeof define === "function" && define.amd) {

        define("jquery", [], function() {

            return jQuery;

        });

    };

    strundefined = typeof undefined;

    if (typeof noGlobal === strundefined) {

        window.jQuery = window.$ = jQuery;

    };

    return jQuery;

}));

在使用浏览器的情况下
typeof module ="undefined"

所以上面的情况是针对于使用Node.js等的情况下判断的,这也表明jQuery正在变得臃肿。

Backbone 封装

打开了Backbone看了一下

(function(root, factory) {
    if (typeof define === 'function' && define.amd) {

        define(['underscore', 'jquery', 'exports'], function(_, $, exports) {

            root.Backbone = factory(root, exports, _, $);

        });
    } else if (typeof exports !== 'undefined') {

        var _ = require('underscore');

        factory(root, exports, _);
    } else {

        root.Backbone = factory(root, {}, root._, (root.jQuery || root.Zepto || root.ender || root.$));

    }
}(this, function(root, Backbone, _, $) {

    Backbone.$ = $;

    return Backbone;
}));

除了异步支持,也体现了其对于jQuery和underscore的依赖,百

        define(['underscore', 'jquery', 'exports'], function(_, $, exports) {

            root.Backbone = factory(root, exports, _, $);

        });

表明backbone是原生支持requirejs的。

Underscore 封装
于是,又看了看Underscore,发现这个库又占领了一个符号 _

(function() {

    var root = this;

    var _ = function(obj) {

        if (obj instanceof _) return obj;

        if (!(this instanceof _)) return new _(obj);

        this._wrapped = obj;

    };
    if (typeof exports !== 'undefined') {

        if (typeof module !== 'undefined' && module.exports) {

            exports = module.exports = _;

        }

        exports._ = _;

    } else {

        root._ = _;

    }
    if (typeof define === 'function' && define.amd) {

        define('underscore', [], function() {

            return _;

        });

    }

}.call(this));

总体上也和差不多都是匿名函数,除了最后用的是call()方法。
Javascript 相关文章推荐
再谈IE中Flash控件的自动激活 ObjectWrap
Mar 09 Javascript
JS 按钮点击触发(兼容IE、火狐)
Aug 07 Javascript
js实现收缩菜单效果实例代码
Oct 30 Javascript
javascript实现切换td中的值
Dec 05 Javascript
JavaScript将一个数组插入到另一个数组的方法
Mar 19 Javascript
Javascript6中字符串的四个新用法分享
Sep 11 Javascript
JS触摸与手势事件详解
May 09 Javascript
基于iScroll实现下拉刷新和上滑加载效果
Jul 18 Javascript
node中modules.exports与exports导出的区别
Jun 08 Javascript
JS实现继承的几种常用方式示例
Jun 22 Javascript
Vue.js组件实现选项卡以及切换特效
Jul 24 Javascript
JS中如何轻松遍历对象属性的方式总结
Aug 06 Javascript
Javascript中的方法链(Method Chaining)介绍
Mar 15 #Javascript
Javascript中的apply()方法浅析
Mar 15 #Javascript
Javascript中的Callback方法浅析
Mar 15 #Javascript
Javascript中的call()方法介绍
Mar 15 #Javascript
Javascript中的高阶函数介绍
Mar 15 #Javascript
Javascript中this关键字的一些小知识
Mar 15 #Javascript
Javascript URI 解析介绍
Mar 15 #Javascript
You might like
第十一节 重载 [11]
2006/10/09 PHP
PHP 5.3.0 安装分析心得
2009/08/07 PHP
一些被忽视的PHP函数(简单整理)
2010/04/30 PHP
PHP 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
Javascript中暂停功能的实现代码
2007/03/04 Javascript
浅谈Javascript中的Function与Object
2015/01/26 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
javascript使用递归算法求两个数字组合功能示例
2017/01/03 Javascript
jquery 实现拖动文件上传加载进度条功能
2018/03/18 jQuery
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
Vue框架里使用Swiper的方法示例
2018/09/20 Javascript
玩转python爬虫之cookie使用方法
2016/02/17 Python
Python中的字符串替换操作示例
2016/06/27 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
Django rest framework工具包简单用法示例
2018/07/20 Python
pandas把所有大于0的数设置为1的方法
2019/01/26 Python
如何关掉pycharm中的python console(图解)
2019/10/31 Python
Python3标准库之functools管理函数的工具详解
2020/02/27 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
python编写softmax函数、交叉熵函数实例
2020/06/11 Python
python3实现飞机大战
2020/11/29 Python
python 模块导入问题汇总
2021/02/01 Python
酒店管理专业毕业生推荐信
2013/11/10 职场文书
本科生职业生涯规划书范文
2014/01/21 职场文书
优秀中学生事迹材料
2014/01/31 职场文书
应届毕业生应聘自荐信范文
2014/02/26 职场文书
二年级班级文化建设方案
2014/05/10 职场文书
火箭队口号
2014/06/18 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
教你怎么用python selenium实现自动化测试
2021/05/27 Python
如何解决php-fpm启动不了问题
2021/11/17 PHP
SpringBoot 集成短信和邮件 以阿里云短信服务为例
2022/04/22 Java/Android
大脑的记忆过程在做数据压缩,不同图形也有共同的记忆格式
2022/04/29 数码科技
MySQL性能指标TPS+QPS+IOPS压测
2022/08/05 MySQL