2011-09-13 16 views
0

次のコードでは、オブジェクトの配列(たとえば、[{...},{...},{...}])であると予想されるmarkers変数を使用します。しかしながら、インデントレベルに応じて、変数はempy配列(すなわち、[])を示す。CoffeeScript/JavaScriptの可変スコープ

jQuery -> 
    markers = [] 
    $.getJSON '/users.json', (data) -> 
    for obj in data 
     marker = {} 
     marker = 
     lastname: namify(obj.name) 
     address: obj.address 
     markers.push(marker) 
    console.log("3rd level", markers) # It shows the array I want. 
    console.log("2nd level", markers) # "markers" shows an empty array. 

マイ期待 - 第2レベルに移入配列。 結果 - 第2レベルの空の配列。

第2レベルのときに、第3レベルのようにアレイを取得するにはどうすればよいですか。

+0

は唯一の2つのスコープがあります。スコープチェーンに外部関数のアクティベーションオブジェクトを持つネストされた関数と、外部関数が終了した後も内部関数が存続する場合、そのようなスコープチェーンを維持するクロージャがあります。 Dunnoはどのように上記のCofffeeScript + jQuery + AJAX + JSONにも当てはまります。 PS。 JSONの外観はどうですか? – RobG

+0

問題はスコープとは関係ありません。 'console.log(" 2nd level ")'行は 'console.log(" 3rd level ")'行の前で走り、以下のcenanozenの答えを見てください。 –

答えて

4

あなたの配列はコールバック関数内に配置されています。したがって、結果を印刷した後に値が設定されます。問題はスコープに関するものではなく、実行の順序に関するものです。

あなたが同期要求を行った場合、あなたが期待するものが表示されるはずです。グローバルと機能:ECMAScriptので

jQuery -> 
    markers = [] 
    $.ajax 
    url: '/users.json' 
    dataType: 'json' 
    async: false 
    success: (data) -> 
     for obj in data 
     marker = {} 
     marker = 
      lastname: namify(obj.name) 
      address: obj.address 
     markers.push(marker) 
    console.log("3rd level", markers) 
    console.log("2nd level", markers) 
+0

もちろん、実際には、実際には、async:false(サーバーが応答するまでブラウザをロックする)を使用したくありません。 'success'コールバックから実行を続けるように、あなたのアプリを構造化するだけです。 –

+0

はい、それは悪い習慣です。私はデモの目的でこの方法で書きました。 – cenanozen

関連する問題