创建全局API对象

问题描述:

我在java脚本中使用模块通过匿名函数模式来具有体现整个模块的匿名函数,并通过设置全局属性来公开特定的公共API部分。创建全局API对象

我尝试设置这样一个全球性质,第二个贴在下面的几种方法失败:

window.foo = (function() { 
    function bar() { this.hello = "world" } 
    return new bar(); 
})(); 

> foo.hello 
"world" // OK 

(function() { 
    window.foo2 = new bar(this.hello = "world"); 
    function bar() {} 
})(); 

> foo2.hello 
undefined // Fail 

为什么第二种方法不是建立一个正确的酒吧对象?

+0

超出范围,则应该从返回块返回的对象。 – 2013-03-13 07:41:19

+1

'新酒吧(this.hello =“world”)'看起来很奇怪。 – pktangyue 2013-03-13 07:43:28

+0

pktangyue,是的,首先会喝点咖啡...对不对 – hotzen 2013-03-13 07:51:57

在您的第二方法:

(function() { 
    window.foo2 = new bar(this.hello = "world"); 
    function bar() {} 
})(); 

thiswindow,和

new bar(this.hello = "world") 

等于

window.hello = "world"; 
new bar(window.hello); 

您可以检查它here

我想你想要的是:

(function() { 
    window.foo2 = new bar("world"); 
    function bar(a) {this.hello = a} 
})(); 

看到here

你应该试试下面

(function() { 
    function bar() { this.hello = "world"; }; 
    window.foo2 = new bar(); 
})(); 
+0

呃,你说的没错....但是功能可以在词汇定义之前调用,不是吗? – hotzen 2013-03-13 07:50:23

+0

@hotzen但在'this.hello =“世界”'''你的情况''这个'是匿名自执行功能不是酒吧。 – jcubic 2013-03-13 07:54:56

的代码的问题是使用构造的对象的方式。试试这两种方法。

window.foo2 = new bar(); 
function bar() {this.hello = "world";}; 

window.foo2 = new bar("world"); 
function bar(x) {this.hello = x;}; 
+0

在第二种情况下,单词“World”存储在window.hello – 2013-03-13 07:53:40