关于一种伪命名空间的写法

作者在 2011-02-16 14:12:08 发布以下内容
在工作学习中我们可能会经常遇到形如这样的代码:
(function(){
//code
})();
 一些朋友可能对此有些不解或曾经不解过。

举个例子,相信大家对 $() 不陌生吧?Prototype里有,jQuery里也有。
当然我也可以自己去定义一个简易的$()供自己来用:
function $(v){
    return document.getElementById(v);
}
 
试考虑这样的情况,假如在页面中我引用了jQuery,同时我又想使用我自己定义的$()去完成一些特定的工作,应该怎样做才能做到我的$()与jQuery的$()和平相处互不干扰呢?
其实这时我们就需要一个封闭的小空间去完成那些特定的工作了。营造这样的一个封闭性空间,将外界$()的干扰隔离开,我在这里面想干嘛干嘛。这就是我在文章开头写到的代码----一个自执行的匿名函数。
与此相同的伪命名空间的思想,也可以通过稍有不同的对象语法来实现,但目的都是相同的----确保你的代码被包含在它自己的小空间内。所以本质上来看,这并没有我们最初想的那样特别或者深奥。只要我们把自己的代码写进这个特殊的函数包装内,那么将没有人能够在这个特殊的包装之外访问到我们的任何自定义函数或对象。
将讲的这些体现在代码中:
(function(){
    function $(v){
        return document.getElementById(v);
    }
    //这里用$()来做一些特定的工作
})();
 使用这种伪命名空间,就是为了封装并保护自己的所有函数、对象和变量。
说到底就是四个字:避免冲突


另外做为本文内容的补充和延伸,简单讨论一下如何将这种技巧实际灵活运用起来。
只要我们把自己的代码写进这个特殊的函数包装内,那么将没有人能够在这个特殊的包装之外访问到我们的任何自定义函数或对象。
显然,这不是绝对的。如果我希望能够从外界环境中去调用包装内的方法 myFun(),该如何去做呢?
还是上面的例子:

(function(){
    function $(v){
        return document.getElementById(v);
    }
    //这里用$()来做一些特定的工作
    function myFun(v){
        alert($(v).innerHTML);
    }
    window['mySpace'] = {};
    window['mySpace']['publicFun'] = myFun;
})();

这样,我们就可以在外部这么用了:
mySpace.publicFun('testid');
其实jQuery的整体设计思路就是这样的。

注:此代码仅用以表达思路,并未实际测试执行过

以上文字为本人结合一些材料,对此问题的一些理解。错误之处欢迎指正和补充。
js | 阅读 1520 次
文章评论,共0条
游客请输入验证码
浏览5885次
最新评论