源码 | 书库 | 模板 | 特效 | 广告 | 素材 | 工具 | 必备 | ALEXA | 字体
会员投稿 投稿指南 RSS订阅
您当前的位置是:主页>网络编程>Javascript教程>

JavaScript技巧与高级特性

www.jz123.cn  2008-12-31   来源:   中国建站    编辑整理    我要投递新闻

这个时候典型的做法是只在全局对象中保存一个对象,所有的功能都通过引用此对象来完成。完成功能所需要的内部状态都封装在一个闭包中。如代码清单 11所示。


清单 11. 使用闭包避免名称空间冲突

 

(function() {
  if (typeof MyCode === "undefined") {
    var defaultName = "Alex";
    MyCode = {
      "sayHello" : function(name) {
        alert("Hello, " + (name || defaultName));
      }
    };
  }
 })();

 MyCode.sayHello();  // 输出为 Hello, Alex
 MyCode.sayHello("Bob"); // 输出为 Hello, Bob
代码中通过创建一个匿名 function 并立即执行来生成一个闭包。在闭包中,通过修改全局对象MyCode来添加所需的功能。内部状态之一的属性defaultName被封装在闭包中,不能被闭包之外的代码所引用,也不会引发命名冲突。

 


保存状态

在 JavaScript 代码运行过程中,不可避免的需要保存一些内部状态。通过使用闭包,可以将内部状态封装在一个 function 内部,使得代码更加简洁。如代码清单 12所示。

 

 

var getNextId = (function() {
  var id = 1;
  return function() {
    return id++;
  }
 })();

 getNextId();  // 输出 1
 getNextId();  // 输出 2
 getNextId();  // 输出 3


代码中的getNextId的功能是生成惟一的 ID,因此它需要维护当前的 ID 这样一个状态。通过使用闭包,不需要在全局对象中添加一个新的属性,该属性由闭包来维护。闭包之外的代码也不能访问或修改getNextId的内部状态。

 

 

折叠调用参数

在 JavaScript 中,有些 function,如setTimeout和setInterval,只接受一个 function 作为参数。在有些情况下,这些 function 的执行是需要额外的参数的。这个时候可以通过使用闭包,将原始 function 的参数进行折叠,得到一个没有参数的新 function 。如代码清单 13所示。


function doSomething(a, b, c) {
  alert(a + b + c);
 }

 function fold(a, b, c) {
  return function() {
    doSomething(a, b, c);
  }
 }

 var newFunc = fold("Hello", " ", "World");
 setTimeout(newFunc, 1000); // 输出为 Hello World
代码中的doSomething需要三个参数来完成其功能。如果直接将doSomething传给setTimeout的话,三个参数的值都是 undefined 。fold将三个参数的值保存在激活对象,并添加在作用域链中。这样即便返回的 function 是没有参数的,它仍然可以获得这三个参数的值。

关于闭包的更多内容,请参见参考资料。

 

上一篇:javascript中如何确定undefine 下一篇:JavaScript Throw教程

评论总数:2 [ 查看全部 ] 网友评论


关于我们隐私版权广告服务友情链接联系我们网站地图