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 相关文章推荐
splice slice区别
Oct 09 Javascript
开发跨浏览器javascript常见注意事项
Jan 01 Javascript
JavaScript 撑出页面文字换行
Jun 15 Javascript
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
May 18 Javascript
JavaScript脚本判断蜘蛛来源的方法
Sep 22 Javascript
一波JavaScript日期判断脚本分享
Mar 06 Javascript
浅谈JavaScript的内置对象和浏览器对象
Jun 03 Javascript
ionic js 复选框 与普通的 HTML 复选框到底有没区别
Jun 06 Javascript
使用snowfall.jquery.js实现爱心满屏飞的效果
Jan 05 Javascript
Node.js readline 逐行读取、写入文件内容的示例
Mar 01 Javascript
vue使用swiper实现左右滑动切换图片
Oct 16 Javascript
vue+django实现下载文件的示例
Mar 24 Vue.js
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
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
2017/03/13 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
PHP简单实现循环链表功能示例
2017/11/10 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
2018/11/10 PHP
jQuery 学习第六课 实现一个Ajax的TreeView
2010/05/17 Javascript
Javascript alert消息换行的方法
2013/08/07 Javascript
jQuery实现ichat在线客服插件
2014/12/29 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
javascript判断复选框是否选中的方法
2015/10/16 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
2015/10/22 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
JS中去掉array中重复元素的方法
2017/05/26 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
2017/08/17 Javascript
vue如何引入sass全局变量
2018/06/28 Javascript
解决vue select当前value没有更新到vue对象属性的问题
2018/08/30 Javascript
利用jqgrid实现上移下移单元格功能
2018/11/07 Javascript
Vue实现远程获取路由与页面刷新导致404错误的解决
2019/01/31 Javascript
layer设置maxWidth及maxHeight解决方案
2019/07/26 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
2020/07/24 Javascript
python 提取文件的小程序
2009/07/29 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
python实现倒计时小工具
2019/07/29 Python
Django用户认证系统 Web请求中的认证解析
2019/08/02 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
2020/06/02 Python
python实现AHP算法的方法实例(层次分析法)
2020/09/09 Python
Django中使用Celery的方法步骤
2020/12/07 Python
网上卖盒饭创业计划书范文
2014/02/07 职场文书
电子装配专业毕业生求职信
2014/04/23 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
财政局个人年终总结
2015/03/03 职场文书
多属性、多分类MySQL模式设计
2021/04/05 MySQL
一文搞懂python异常处理、模块与包
2021/06/26 Python
python 实现图片特效处理
2022/04/03 Python
Spring Cloud OAuth2实现自定义token返回格式
2022/06/25 Java/Android