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 相关文章推荐
判断JavaScript对象是否可用的最正确方法分析
Oct 03 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
May 24 Javascript
javascript模拟地球旋转效果代码实例
Dec 02 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
Jun 09 Javascript
node.js中的http.response.end方法使用说明
Dec 14 Javascript
JQuery实现超链接鼠标提示效果的方法
Jun 10 Javascript
iscroll实现下拉刷新功能
Jul 18 Javascript
JS 中LocalStorage和SessionStorage的使用
Aug 17 Javascript
node的process以及child_process模块学习笔记
Mar 06 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
Mar 15 Javascript
Vuex 模块化使用详解
Jul 31 Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
Feb 07 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
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
一个PHP缓存类代码(附详细说明)
2011/06/09 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
php版微信公众号自定义分享内容实现方法
2016/09/22 PHP
PHP模拟http请求的方法详解
2016/11/09 PHP
老生常谈文本文件和二进制文件的区别
2017/02/27 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
2017/07/04 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
javascript 处理HTML元素必须避免使用的一种方法
2009/07/30 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
html a标签-超链接中confirm方法使用介绍
2013/01/04 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
jQuery实现倒计时按钮功能代码分享
2014/09/03 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
JavaScript之promise_动力节点Java学院整理
2017/07/03 Javascript
vue proxyTable 接口跨域请求调试的示例
2017/09/12 Javascript
nodejs express配置自签名https服务器的方法
2018/05/22 NodeJs
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
Vue封装的组件全局注册并引用
2019/07/24 Javascript
Vue v-model组件封装(类似弹窗组件)
2020/01/08 Javascript
python 基础学习第二弹 类属性和实例属性
2012/08/27 Python
如何解决django配置settings时遇到Could not import settings 'conf.local'
2014/11/18 Python
使用python绘制常用的图表
2016/08/27 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
2019/06/13 Python
python实现启动一个外部程序,并且不阻塞当前进程
2020/12/05 Python
python wsgiref源码解析
2021/02/06 Python
加拿大约会网站:EliteSingles.ca
2018/01/12 全球购物
写给保洁员表扬信
2014/01/08 职场文书
法人授权委托书
2014/04/03 职场文书
治超工作实施方案
2014/05/04 职场文书
群众路线查摆问题整改措施
2014/10/10 职场文书
社区务虚会发言材料
2014/10/20 职场文书
退休欢送会致辞
2015/07/31 职场文书