2011-09-13 5 views
3

SmartyのJSONデータを渡しています。これをJavaScript変数optionsに適用します。奇妙なJavaScriptの振る舞い、コンバータ関数が呼び出される前の変数の値が変更されています

あなたが私の以前の質問について私が知っていることを知っているのであれば、私はデータが入ってくるのを少しはやる必要があるので、私はchart_convert_dates()という関数を持っています。よく、options.data)、それが戻ってくると再び戻ってくる。

私のコードを読んでいると、オプションの変数をデバッグしていることがわかります。の前に、という関数が呼び出されています!

私が関数呼び出しをコメントアウトした場合、その時点で変数は変更されません。

これはChrome、FFで発生します...何が起こっていますか?

{literal} 

    <script type="text/javascript"> 

     $(document).ready(function() { 

      // set JS var, this data is coming in from smarty 
      var options = {/literal}{$options}{literal}; 

      // these should both be exactly the same 
      debug.debug({/literal}{$options}{literal}); 
      debug.debug(options); 

      // but the above outputs aren't the same! options has been modified 
      // by the function below... that hasn't even fired yet!? We can prove 
      // this by commenting out the following function call 

      options.data = chart_convert_dates(options.data); 

      // ... do something else 

     }); 

    </script> 

{/literal} 
+0

生成されたコードとは何ですか?おそらくあなたはそこに警告を見ることができます。 – pimvdb

+2

debug.debugの代わりにalertを使用するとどうなりますか?ブレークポイントを設定して値を検査しましたか? –

+0

@Johannes私は、ブレークポイントを入れました、そして、変数が変更されていないうちに、Mattが指摘したように、関数は... 'debug.debug'の問題でなければなりません。ありがとう:-) –

答えて

2

これはもちろん不可能です。

debug.debug()関数は、文字列に変換するのではなく、提供されているオブジェクトへの参照を保存していることがよくあります。あなたはそれの内容は後でで引数だ表示すると、出力はオブジェクトの現在の状態ではなく、状態を反映すること

これが最良の次の例で説明されています。:

var debug = { 
    report: function() { 
     // console.log(this._value); 
    }, 
    debug: function (arg) { 
     this._value = arg; // save a reference 
    } 
} 

var options = { 
    foo: 1 
}; 

debug.debug(options); 

options.foo = 2; 

debug.report(); // will show 2 (http://jsfiddle.net/zQFPm/) 

http://jsfiddle.net/zQFPm/

+0

多くのおかげでマットは、よく説明されて、それは何が起こっているかかなり確か。 –

関連する問題