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 相关文章推荐
java script编程起步(第三课)
Jan 10 Javascript
Js日期选择器并自动加入到输入框中示例代码
Aug 02 Javascript
解析Javascript小括号“()”的多义性
Dec 03 Javascript
解析页面加载与js函数的执行 onload or ready
Dec 12 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
Aug 04 Javascript
HTML5实现微信拍摄上传照片功能
Apr 21 Javascript
纯JS实现简单的日历
Jun 26 Javascript
JS实现图片放大镜插件详解
Nov 06 Javascript
用Vue写一个分页器的示例代码
Apr 22 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
Jun 22 Javascript
vue父子组件间引用之$parent、$children
May 20 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
May 27 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读取RSS feed的代码
2008/08/01 PHP
php简单提示框alert封装函数
2010/08/08 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
PHP计算近1年的所有月份
2017/03/13 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
PHP实现随机数字、字母的验证码功能
2018/08/01 PHP
jquery插件jTimer(jquery定时器)使用方法
2013/12/23 Javascript
JS文字球状放大效果代码分享
2015/08/19 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
jquery请求servlet实现ajax异步请求的示例
2017/06/03 jQuery
微信小程序 sha1 实现密码加密实例详解
2017/07/06 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
微信小程序实现的图片保存功能示例
2019/04/24 Javascript
详细解析Python中__init__()方法的高级应用
2015/05/11 Python
python实现随机漫步算法
2018/08/27 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
2019/06/27 Python
Python3使用PySynth制作音乐的方法
2019/09/09 Python
python3 实现函数写文件路径的正确方法
2019/11/27 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
matplotlib制作雷达图报错ValueError的实现
2021/01/05 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
英国高级百货公司:Harvey Nichols
2017/01/29 全球购物
《雨点》教学反思
2014/02/12 职场文书
法律进企业活动方案
2014/03/04 职场文书
化学专业自荐信
2014/05/28 职场文书
乡镇四风对照检查材料
2014/08/31 职场文书
银行业务授权委托书
2014/10/10 职场文书
2014年环保工作总结
2014/11/26 职场文书
婚宴来宾致辞
2015/07/28 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书
php中pcntl_fork详解
2021/04/01 PHP
Java Optional<Foo>转换成List<Bar>的实例方法
2021/06/20 Java/Android
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android