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();)。

なぜそれが起こるのですか?それを変更する方法はありますか?

コードを 1 つのスコープに入れるだけでうまく機能することはわかっていますが、別の 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 に答える