2016-07-02 9 views
0

私は、関数が呼び出されるたびに、コンパイラはすべての可視変数をスタックに置きます。これはクロージャもやや関連していますが、今は次のコードを使っています。 dはnode.jsのような並行環境で動作します。JavaScriptのコールスタック変数

Product.prototype.list = function(body) { 
    body.options = { 
     hostname: endPoints.product, 
     path: '/applications/' + body.entityType 
     method: 'GET' 
    }; 
    return remote.request(body) 
     .then(function(result){ 
      body[body.entityType] = result; 
      return body; 
     }); 
}; 

今すぐ次の二つの機能を同時に約束を使用して呼び出された場合、閉鎖が起こるのだろうか?例えば

product.list({entityType: "coke"}) 
    .then(console.log); //will this have {coke: []} or {pepsi: []} 

product.list({entityType: "pepsi"}) 
    .then(console.log); 
+0

「製品」は何に依存するのでしょうか? – adeneo

答えて

1

はい閉鎖は、あなたがthenに渡す匿名関数によって作成されます。閉鎖されている変数は、list関数に渡される値bodyです。

listを呼び出すたびに、上記の例では2回呼び出されました。bodyオブジェクトにいくつかの値を追加し、新しいクロージャをインスタンス化してその値を利用できるようにします。 listの各呼び出しに渡す値は両方ともオブジェクトリテラルであり、完全に別々のものであり、クロージャに異なる値を渡すことになるため、「コークス」を含む呼び出しがコールは「ペプシ」を含む。

+0

クロージャ作成の時間の詳細については、関数 'list'が呼び出されたとき、または' .then'が呼び出されたときにクロージャが作成されますか? – user2727195

+0

@ user2727195 - 自由変数 'body'が渡され、定義され、そのスコープで覚えているので、' list() '関数が呼び出されたときにクロージャが作成されます。これは' remote.request() .then(... 'それは字句的なので機能します。 – adeneo