2013-01-13 131 views
0

可能重複:
Is it possible to gain access to the closure of a function?訪問對象(JavaScript)的

請看看下面的代碼:http://jsfiddle.net/FH6pB/1/

(function($) { 
    var o1 = { 
    init: function() { alert('1'); }, 
    } 
    var o2 = { 
    init: function() { alert('2'); }, 
    } 
}(jQuery)); 

(function($) { 
    var o3 = { 
    init: function() { alert('3'); }, 
    } 
    o2.init(); 
}(jQuery)); 


o1.init(); 
o2.init(); 

我有3個對象2個不同的「範圍」(我不知道這裏使用的是否是合適的詞,但我想你明白了需要整理)。 正如您可能知道的,我無法從外部或其他「範圍」訪問對象的功能(非o.init();將工作)。

爲什麼發生?有沒有辦法改變它?

我知道我可以把代碼放在一個範圍內,它可以很好地工作,但是如果我在單獨的JS文件中有範圍呢?從提前

感謝, 本

+0

有一個在撥弄沒有代碼。 –

+2

請不要只把你的代碼放在小提琴裏,也要把它放在問題上。 –

回答

1

不,你不能訪問從外部封閉聲明的變量。這就是關閉工作的方式。

A(普遍不好)解決方案,將是聲明變量爲全局的:

(function($) { 
    window.o2 = { 
    init: function() { alert('2'); }, 
    }; 
}(jQuery)); 

o2.init(); 

但通常,模塊模式是用來做一些私有變量,只返回有用的。見this article

1

你可以使用一個命名空間,如:

http://jsfiddle.net/FH6pB/2/

var scope = {}; 

(function($) { 
    scope.o1 = { 
    init: function() { alert('1'); }, 
    } 
    scope.o2 = { 
    init: function() { alert('2'); }, 
    } 
}(jQuery)); 

(function($) { 
    scope.o3 = { 
    init: function() { alert('3'); }, 
    } 
    scope.o2.init(); 
}(jQuery)); 


scope.o1.init(); 
scope.o2.init();