4

仕事のために更新する必要があるコード ベースを継承しました。実施されている閉鎖で彼らが何を達成しようとしているのかをゆっくりと学んでいますが、この機能を使用するサイトの一部を更新しようとすると行き詰まります. コードが達成しようとしていることの基本的な概要を説明し、誰かが助けてくれるかどうかを確認します。

var TheObject = (function (){
    var veryLargeDependantData = {
        var1: {}, 
        var2: {}, 
        var3: [],
        //Set these variables via functions
        function1: function f1(data){...}, 
        function2: function f2(data){...}, 
        initialize: function initialize() { //set values for var1... var3}
     };

     return {initialize: veryLargeDependentData.initialize};
})().initialize(); 

私は明らかにサイト上で製品コードを表示できないため、これを行う必要があります。しかし基本的に、veryLargeDependentData 変数は関数への入り口です。ページが読み込まれると、初期化関数が呼び出され、すべてが満足しています。しかし、これを古いページの onclick イベントに追加する必要があり、firebug コンソールに変数が未定義であると表示されます。他のページでは問題なく使用できています。

私の質問は、クロージャーがこのような呼び出し可能な名前空間の一部にならないようにする魔法が起こっているということです。私は少し JavaScript に疎いので、質問が間違っているように聞こえたらお詫びします。

onclick='TheObject.initialize();'
4

3 に答える 3

2

このコードでは、 の値はメソッドが返すTheObjectものになります。veryLargeDependentData.initialize()初期化メソッドが何も返さない場合、TheObject未定義になります。

簡単な例:

var TheObject = (function () {
  return {
    initialize: function () { 
      // stuff happens here, but importantly, there's nothing returned
    }
  }
})().initialize();

これを次の実行順序に分解できます。

// the value of step_one is a function that will return an object when it is run
var step_one = (function () {
  return {
    initialize: function () {
      // ...
    }
  }
});

// after running the function step_one, step_two will be an object
// containing one key - initialize - which is a function
var step_two = step_one();

// since initialize doesn't return anything, TheObject is set to undefined.
var TheObject = step_two.initialize();

TheObject初期化メソッドを含むオブジェクトに設定し、必要なときにそのメソッドを再度実行することで、これを回避できます。

var TheObject = (function () {
  return {
    initialize: function () {
    }
  }
})();

// initialize
TheObject.initialize();

// and again
TheObject.initialize();

ご注意ください!

元の作成者は、initialize メソッドを 1 回だけ実行することを意図していた可能性があります。複数回実行すると、システムにバグが発生する可能性があります。

于 2013-05-31T14:57:27.383 に答える