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 语法集锦 脚本之家基础推荐
Nov 15 Javascript
jquery.lazyload  实现图片延迟加载jquery插件
Feb 06 Javascript
JavaScript浏览器选项卡效果
Aug 25 Javascript
JavaScript中的Array对象使用说明
Jan 17 Javascript
JavaScript高级程序设计 阅读笔记(十三) js定义类或对象
Aug 14 Javascript
jQuery $.extend()用法总结
Jun 15 Javascript
JS数组的遍历方式for循环与for...in
Jul 31 Javascript
JavaScript中解析JSON数据的三种方法
Jul 03 Javascript
微信小程序 标签传入数据
May 08 Javascript
React.js中常用的ES6写法总结(推荐)
May 09 Javascript
Js利用console计算代码运行时间的方法示例
Sep 24 Javascript
环形加载进度条封装(Vue插件版和原生js版)
Dec 04 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用户指南-cookies部分
2006/10/09 PHP
PHP的异常处理类Exception的使用及说明
2012/06/13 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
2014/06/19 PHP
PHP如何实现Unicode和Utf-8编码相互转换
2015/07/29 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
javascript 图片裁剪技巧解读
2012/11/15 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
2013/05/07 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
Bootstrap入门书籍之(三)栅格系统
2016/02/17 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
基于angularJS的表单验证指令介绍
2016/10/21 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
js操作二进制数据方法
2018/03/03 Javascript
JavaScript刷新页面的几种方法总结
2019/03/28 Javascript
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
对Python 文件夹遍历和文件查找的实例讲解
2018/04/26 Python
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
python面试题小结附答案实例代码
2019/04/11 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
Python实现疫情地图可视化
2021/02/05 Python
荷兰街头时尚之家:Funkie House
2019/03/18 全球购物
父亲生日宴会答谢词
2014/01/10 职场文书
高中考试作弊检讨书
2014/01/14 职场文书
《我的信念》教学反思
2014/02/15 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
党支部先进事迹材料
2014/12/24 职场文书
客户付款通知书
2015/04/23 职场文书
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python