03 Mar 2012

浅说Javascript的namespace 和 private

Douglas Crockford

我参与的项目用了很多javascript。比如

  • 中文版美味书签: 选集查看页面是用javascript渲染的; 选集创建,js也起了很重要的作用
  • Track: 就是一个Javascript App, 很多逻辑都是 在浏览器完成, 包括routing, 生成HTML……
  • Rssminer: javascript做了更多事情, 比如浏览器端 生产HTML, 去广告, 实现readability……

依赖Javascript有很多好处,不细说。缺点也有一堆,比如“没有namespace和private”, 他们是模块化和封装的基础,我感觉尤为关键。packageprivate是javascript的关键字,但是作用却是:不小心用作变量名, object的key,程序出错,仅此而已。但是上帝在把门关上的时候,留了一个窗户。用函数可以实现他们(从某种意义上说)

// utils.js
(function () {
  //  private. given by closure
  var private_var = 1;
  var helper1 = function () { };
  // namespace: YOUR_NS. given by javascript's global object
  window.YOUR_NS = window.YOUR_NS || {};
  window.YOUR_NS.utils = {
    helper1: helper1            // export, public
  };
  // create an anonymous function, execute it immediately
})();
// app.js
(function () {
  // like java's import, c++'s using namespace
  var utils = window.YOUR_NS.utils;
  var utils2 = window.YOUR_NS.utils;  // rename
  // direct import, java's import static
  var helper1 = utils.helper1;
  // you app's logic here
  utils.helper1();              // smaple usage
  utils2.helper1();             // smaple usage
  helper1();                    // smaple usage
})();
<!-- app.html -->
<!-- browser load and execute them in order -->
<script src="utils.js"></script>
<script src="app.js"></script>
blog comments powered by Disqus