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 相关文章推荐
解决Extjs上传图片无法预览的解决方法
Mar 22 Javascript
extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面
Apr 02 Javascript
判断客户浏览器是否支持cookie的示例代码
Dec 23 Javascript
js中reverse函数的用法详解
Dec 26 Javascript
jquery学习总结(超级详细)
Sep 04 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
Feb 24 Javascript
javascript实现tab切换的两个实例
Nov 05 Javascript
JS中多步骤多分步的StepJump组件实例详解
Apr 01 Javascript
vue实现条件叠加搜索的解决方法
May 28 Javascript
js 实现watch监听数据变化的代码
Oct 13 Javascript
Vue搭建后台系统需要注意的问题
Nov 08 Javascript
Vue 嵌套路由使用总结(推荐)
Jan 13 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
PHP怎样调用MSSQL的存储过程
2006/10/09 PHP
如何跨站抓取别的站点的页面的补充
2006/10/09 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
利用javascript实现一些常用软件的下载导航
2009/08/03 Javascript
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
jquery实现居中弹出层代码
2010/08/25 Javascript
js作用域及作用域链概念理解及使用
2013/04/15 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
JavaScript字符串对象(string)基本用法示例
2017/01/18 Javascript
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
在一般处理程序(ashx)中弹出js提示语
2017/08/16 Javascript
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
2018/09/28 Javascript
MySQLdb ImportError: libmysqlclient.so.18解决方法
2014/08/21 Python
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
PyChar学习教程之自定义文件与代码模板详解
2017/07/17 Python
python调用c++传递数组的实例
2019/02/13 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
Django中的session用法详解
2020/03/09 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
业务员岗位职责范本
2013/12/15 职场文书
高一自我鉴定
2013/12/17 职场文书
领导视察欢迎词
2014/01/15 职场文书
会计求职信范文
2014/05/24 职场文书
场地使用证明模板
2014/10/25 职场文书
小学教师节活动总结
2015/03/20 职场文书
小学生安全保证书
2015/05/09 职场文书
运输公司工作总结
2015/08/11 职场文书
小学家庭教育心得体会
2016/01/14 职场文书
《正比例》教学反思
2016/02/23 职场文书
读《儒林外史》有感:少一些功利,多一些真诚
2020/01/19 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android