0

可能重复:
是否可以访问函数的闭包?

请看一下这段代码: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 文件中有范围怎么办?

提前感谢,本

4

2 回答 2

1

不,您不能从外部访问闭包中声明的变量。这就是闭包的工作原理。

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

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

o2.init();

但通常,模块模式用于将一些变量设为私有,只返回有用的变量。见这篇文章

于 2013-01-13T15:34:54.920 回答
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();
于 2013-01-13T15:50:04.873 回答