2016-09-08 10 views
0

ここに私の次のコードブロックがあります。私は、valオブジェクトを関数test1からtest2に渡して、その値をtest2に変更して送り返します。JS関数の可変スコープを理解できませんでした

var Promise = require("bluebird"); 
var list = [1,2,3]; 

var test1 = function(test) { 
    return new Promise(function(resolve,reject) { 
     var val = {"name" : "my_name","age" : 25}; 
     for (var item in list) { 
      (function (item) { 
       console.log("val",val); 
       test2(val) 
        .then(function(test2Response) { 
         console.log("test2Response",test2Response) 
        }); 
      })(item) 
     } 
    }); 
}; 


var test2 = function(val1) { 
    return new Promise(function(resolve,reject) { 
     console.log("val1",val1) 
     val1.name = val1.name + "_1" 
     resolve(val1) 
    }) 
} 


test1() 

そして、ここで様々な段階での私の変数valval1の私の値です。

val { name: 'my_name', age: 25 } 
val1 { name: 'my_name', age: 25 } 


val { name: 'my_name_1', age: 25 } 
val1 { name: 'my_name_1', age: 25 } 


val { name: 'my_name_1_1', age: 25 } 
val1 { name: 'my_name_1_1', age: 25 } 


test2Response { name: 'my_name_1_1_1', age: 25 } 
test2Response { name: 'my_name_1_1_1', age: 25 } 
test2Response { name: 'my_name_1_1_1', age: 25 } 

Iヴァルの値は、私が唯一val1ないvalを更新するにもかかわらず、すべての反復のために変更する理由を理解couldntの。 valをそのまま維持し、「val1」のみを変更するにはどうすればよいですか?

+1

javascriptオブジェクトは参照渡しされます。 [アンダースコア: 'dupe = _clone(obj)'](http://underscorejs.org/#clone) – Plato

+1

私はそれを知っていませんでした悪い....魅力のように動作します!!!!!ありがとうございました –

+0

'test1'の'新しいPromise'はまったく動作しません。あなたは 'Promise.all'を使用するべきです – Bergi

答えて

0

test2にvalを渡した場合、val1としてメモリ内の参照は同じです。あなたは簡単にtest2を呼び出す前に、このようにすることによって行うことができるtest2に渡す前に値を複製する必要があります:

var copyOfVal = Object.assign({}, val) // this just creates a new object using the same contents of val but different references in memory. 

その後、test2copyOfValを渡し、あなたが別の結果を得ることができます。

+0

woa! btwこれはES6 – Plato

+0

PS [この回答](http://stackoverflow.com/a/34283281/1380669)は、このアプローチは "深いクローン"ではないことを言いますが、私はそれが何を意味するか正確にはわかりません:) – Plato

+1

' _.clone'も浅いクローンだけです。つまり、ネストされたオブジェクトを持つオブジェクトがある場合、ネストされたオブジェクトはクローンされず、実際には初期オブジェクトと同じ参照を持ちます。つまり、ネストされたプロパティの1つを変更すると、元のプロパティとコピーの両方で変更されます。 Lodashは '_.cloneDeep(obj)'を持っています。このパターンは、あなたがそのパターンに合ったオブジェクトであれば、再帰的に複製します。 – finalfreq

関連する問題