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 fckeditor集成代码
May 10 Javascript
让浏览器非阻塞加载javascript的几种方法小结
Apr 25 Javascript
使用jquery实现简单的ajax
Jul 08 Javascript
多种方式实现JS调用后台方法进行数据交互
Aug 20 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
Apr 12 Javascript
微信小程序实现实时圆形进度条的方法示例
Feb 24 Javascript
通过npm引用的vue组件使用详解
Mar 02 Javascript
Swiper实现轮播图效果
Jul 03 Javascript
详解如何在项目中使用jest测试react native组件
Feb 09 Javascript
微信小程序手机号码验证功能的实例代码
Aug 28 Javascript
JS实现的合并两个有序链表算法示例
Feb 25 Javascript
详解前端任务构建利器Gulp.js使用指南
Apr 30 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与SQL注入攻击[三]
2007/04/17 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
PHP构造二叉树算法示例
2017/06/21 PHP
用jscript启动sqlserver
2007/06/21 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
jquery属性过滤选择器使用示例
2013/06/18 Javascript
js jquery获取随机生成id的服务器控件的三种方法
2013/07/11 Javascript
JS代码判断IE6,IE7,IE8,IE9的函数代码
2013/08/02 Javascript
将数字转换成大写的人民币表达式的js函数
2014/09/21 Javascript
javascript实现根据身份证号读取相关信息
2014/12/17 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
详解在Vue中如何使用axios跨域访问数据
2017/07/07 Javascript
javaScript手机号码校验工具类PhoneUtils详解
2017/12/08 Javascript
jQuery实现ajax回调函数带入参数的方法示例
2018/06/26 jQuery
Angularjs中的$apply及优化使用详解
2018/07/02 Javascript
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
如何使用JavaScript实现栈与队列
2019/06/24 Javascript
vue中 this.$set的用法详解
2019/09/06 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
微信小程序订阅消息(java后端实现)开发
2020/06/01 Javascript
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
python实现哈希表
2014/02/07 Python
python制作花瓣网美女图片爬虫
2015/10/28 Python
Python实现图片滑动式验证识别方法
2017/11/09 Python
对python GUI实现完美进度条的示例详解
2018/12/13 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
JupyterNotebook 输出窗口的显示效果调整实现
2020/09/22 Python
零件设计自荐信范文
2013/11/27 职场文书
银行求职信个人范文
2013/12/16 职场文书
大学生最新职业生涯规划书范文
2014/01/12 职场文书
酒鬼酒广告词
2014/03/21 职场文书
党的群众路线教育实践活动对照检查剖析材料
2014/10/09 职场文书
python内置进制转换函数的操作
2021/06/02 Python
Python 居然可以在 Excel 中画画你知道吗
2022/02/15 Python