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 相关文章推荐
Stop SQL Server
Jun 21 Javascript
javascript 操作文件 实现方法小结
Jul 02 Javascript
js DOM模型操作
Dec 28 Javascript
jquery 圆形旋转图片滚动切换效果
Jan 19 Javascript
js setTimeout opener的用法示例详解
Oct 23 Javascript
js控制容器隐藏出现防止样式变化的两种方法
Apr 25 Javascript
js获取当前日期前七天的方法
Feb 28 Javascript
简介AngularJS中使用factory和service的方法
Jun 17 Javascript
使用jsonp实现跨域获取数据实例讲解
Dec 25 Javascript
jQuery窗口拖动功能的实现代码
Feb 04 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
Dec 13 Javascript
vue props 一次传多个值实例
Jul 22 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会话(Session)实现用户登陆功能
2013/06/29 PHP
PHP解决URL中文GBK乱码问题的两种方法
2014/06/03 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
thinkPHP5.0框架开发规范简介
2017/03/25 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
JavaScript 对象链式操作测试代码
2010/04/25 Javascript
js中单引号与双引号冲突问题解决方法
2013/10/04 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
javascript 终止函数执行操作
2014/02/14 Javascript
jQuery选择id属性带有点符号元素的方法
2015/03/17 Javascript
实例详解ECMAScript5中新增的Array方法
2016/04/05 Javascript
浅谈JavaScript异步编程
2017/01/20 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
React Native基础入门之调试React Native应用的一小步
2018/07/02 Javascript
浅谈Ant Design Pro 菜单自定义 icon
2020/11/17 Javascript
探究Python多进程编程下线程之间变量的共享问题
2015/05/05 Python
Python中Continue语句的用法的举例详解
2015/05/14 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
遗传算法python版
2018/03/19 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
python接口自动化之ConfigParser配置文件的使用详解
2020/08/03 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
css3 box-sizing属性使用参考指南
2013/01/08 HTML / CSS
html5 div布局与table布局详解
2016/11/16 HTML / CSS
详解html5 canvas常用api总结(二)--绘图API
2016/12/14 HTML / CSS
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
美国轮胎网站:Priority Tire
2018/11/28 全球购物
新西兰购物网站:TheMarket NZ
2020/09/19 全球购物
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
缴纳养老保险的证明
2014/01/10 职场文书
财务工作者先进事迹材料
2014/01/17 职场文书
作文评语集锦大全
2014/04/23 职场文书
厂区绿化方案
2014/05/08 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
MySQL中日期型单行函数代码详解
2021/06/21 MySQL