从其他范围访问对象(javascript)

时间:2013-01-13 15:33:29

标签: javascript jquery

  

可能重复:
  Is it possible to gain access to the closure of a function?

请查看此代码: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();

我在2个不同的“范围”中有3个对象(我不知道在这里使用它是否是正确的词,但我想你理解其含义)。 您可能知道,我无法从外部或其他“范围”访问对象的功能(o.init();的非功能)。

为什么会这样?有没有办法改变它?

我知道我可以把代码放在一个范围内并且它会运行良好,但是如果我将范围放在单独的JS文件中会怎么样?

先谢谢了, 本

2 个答案:

答案 0 :(得分:1)

不,您无法从外部访问闭包中声明的变量。这就是关闭工作的方式。

一个(通常很糟糕的)解决方案是将变量声明为全局变量:

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

o2.init();

但通常,模块模式用于私有一些变量,只返回有用的变量。请参阅this article

答案 1 :(得分: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();