2012-04-28 84 views
0

我读another question,我看到了这一点:有人可以解释下面一段Javascript代码吗?

var basketModule = (function() { 
var basket = []; //private 

return { //exposed to public 
     addItem: function(values) { 
      basket.push(values); 
     }, 
     getItemCount: function() { 
      return basket.length; 
     }, 
     getTotal: function(){ 
      var q = this.getItemCount(),p=0; 
      while(q--){ 
       p+= basket[q].price; 
      } 
     return p; 
     } 
     } 
}()); 

能否请您解释一下为什么他包裹功能(and)的?另外,return的目的是什么?他能不能只写self.addItem = ...等等?

回答

2

当你用一个parantheses包装一个函数,并且在其末尾添加()时,它是一个自我执行的函数。

(function() x() { 
//do something; 
})(); 

而且,通过返回他使basket变量有点私人。尝试从其他地方获得basketModule.basket,并且您将得到未定义的内容。

0

注意最后一行中的括号:()。该函数被定义,并立即被称为: (function() { })();

return { ... }返回具有方法addItem

2

这就是所谓的javascript Module Pattern的对象。定义函数并立即将其调用到可防止变量位于全局空间中或定义函数名称。

+0

我只会补充说这是al l部分技术称为unobtrusive JavaScript:http://en.wikipedia.org/wiki/Unobtrusive_JavaScript – 2012-04-28 11:31:38

0

代码的意图是用三种方法创建一个对象。 addItem,getItemCount和getTotal。他们都依赖篮子所代表的国家。

如果篮子是全局定义的,状态将被暴露(并且可能只有一个变量篮子,这两者都可能导致问题,因此通过包装整个声明,状态被封装并且只能从创建的对象访问。

有殊途同归,和亲的和反对的都与风格,有多少你会需要一个特定类型的对象的其他方式。

包装,因为function(){}()不会解析function(){}()需要

相关问题