在使用阿里开源的druid数据库连接池时,发现它的jar包中包含了三个资源包:
support.http.resources,support.
http.resources.css,
support.http.resources.js
打开看,有很多的html页面和他们的css和js文件,奇怪的是其中的jquery.min.js是被他们修改过了的,在其中增加了一个命名空间的函数:
/* 这里是经过压缩的jquery.min.js源码,省略*/
$.namespace = function() {
var a=arguments, o=null, i, j, d;
for (i=0; i<a.length; i=i+1) {
d=a[i].split(".");
o=window;
for (j=0; j<d.length; j=j+1) {
o[d[j]]=o[d[j]] || {};
o=o[d[j]];
}
}
return o;
};
具体代码可以参考:https://github.com/alibaba/druid/blob/master/src/main/resources/support/http/resources/js/jquery.min.js
使用方法是:
<sctipt type="text/javascript">
$.namespace("druid.common.test");
druid.common.test = function () {
//......
return {
init : function() {
}
// ... ...
}
}();
// 可以如下调用命名空间的函数:
druid.common.test.init();
</script>
这里的含义是在window上定义了一个命名空间druid.common.test,然后在该命名空间中定义一些要使用的方法,我们在页面上使用这些方法时,就可以这样调用:druid.common.test.init();
如果我们F12打开firebug调试,点击“脚本”选项,就会在右边看到其实质就是在window上定义了一个 druid 对象,然后又在改对象上定义一个common对象,最后再common对象上定义一个test对象,init函数就是test对象上的函数或者说方法。
$.namespace("druid.common.test");其实等价于下面的代码:
arguments = "druid.common.test";
var d = arguments[0].split(".");
window[d[0]] = window[d[0]]||{};
window[d[0]][d[1]] = window[d[0]][d[1]]||{};
window[d[0]][d[1]][d[2]] = window[d[0]][d[1]][d[2]]||{};
所以namespace函数的实质就是使用对象链条,来模拟命名空间。
明白了原理,那么我们自己不使用$.namespace()函数也可以自己定义命名空间:
// 假设项目名称为jblog,然后这是index.jsp页面中的js,那么可以如下这样写:
window.jblog = window.jblog || {};
window.jblog.index = window.jblog.index || {};
jblog.index = function(){
return {
init : function(){
// 这里是函数init的定义
alert('init');
}
}
}();
// 这样使用它:
jblog.index.init();
这样就可以将一个页面中所有的函数以及变量都放入命名空间 jblog.index 下面,极大的降低了当要引入其他js库是存在名字冲突的可能性。
比如long.jsp页面中的js代码就可以将其放入命名空间 jblog.login 下面。
注意代码“window.jblog = window.jblog || {};”中后面的“ || {}”不能省略,这是为了防止将原有的命名空间覆盖掉!
分享到:
相关推荐
命名空间.js 一个简单的 JavaScript 命名空间函数。背景为了将代码组织成逻辑组,Java 和 C# 等编程语言具有namespace的概念。 JavaScript 没有命名空间的概念——但可以创建类似的功能。 Namespace.js 就是这样做的...
JavaScript 中的命名空间这是一个小函数,它为您在 JavaScript 中声明和使用命名空间提供了一个很好的、简单的语法。 除了处理命名空间之外,它不会做任何事情:例如,它不会尝试加载其他脚本或模块。 它遵循我的...
JavaScript创建命名空间(namespace)通过自定义函数进行类型判断、数组遍历、函数执行等相关操作来实现命名空间的功能,需要的朋友可以参考一下
vs2010 导出创建dll 导入使用dll 导出有命名空间的类 函数 外部函数
PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。 不过在PHP当中还是有着相当重要的意义。 PHP 命名空间可以解决以下两类问题: 用户编写的代码与PHP内部的类/函数/...
C++ using namespace std 详解 所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
ACE_OS命名空间函数参考文档 用ACE跨平台最常用的系统函数
我们在默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样,命名空间通过关键字namespace 来声明,如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。我们来看下...
深入理解JavaScript系列(2):揭秘命名函数表达式
namespace(命名空间)相当于函数、类,划分了一个区域,这样子就使得在同个页面中可以require相同的类,使用相同名字的函数 : 在项目中比较少用 name.php: <?php //命名要使用复合名称 namespace me\mine; ...
曾经学C++的时候,经常听到这个...局部命名空间(local namespace):即函数中定义的名称 —— 包括函数中的变量、参数、局部变量等; 全局命名空间(global namespace):即模块中定义的名称 —— 包括模块中的变量、
javascript自执行函数之伪命名空间封装法.docx
PHP的命名空间(namespace)是PHP 5.3中加入最重要的一个新特性,这个概念在C#中已经很早就有了,php中的namespace其实和c#的概念是一样的。 一. PHP的命名空间主要解决三种冲突的问题:常量,函数,类 通俗理解:...
C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用
命名空间的设计目的是提供一种让一组名称与其他名称分隔开的方式。在一个命名空间中声明的...为了调用支持命名空间版本的函数或变量,会把命名空间的名称置于前面,如下所示: namespace_name.item_name; 下面的程序演
本文实例讲述了PHP命名空间namespace定义及导入use用法。分享给大家供大家参考,具体如下: 在PHP中,出现同名函数或是同名类是不被允许的。为防止编程人员在项目中定义的类名或函数名出现重复冲突,在PHP5.3中引入...
js 函数 javaScript 自定义函数一览表 js 函数 javaScript 自定义函数一览表
开源版本gpt3.5无需服务器搭建(阿里云函数开源版本gpt3.5无需服务器搭建(阿里云函数开源版本gpt3.5无需服务器搭建(阿里云函数开源版本gpt3.5无需服务器搭建(阿里云函数开源版本gpt3.5无需服务器搭建(阿里云函数...
命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。这种情况下只要避免命名重复就可以解决
JS公共函数JS公共函数JS公共函数JS公共函数JS公共函数JS公共函数JS公共函数JS公共函数JS公共函数