2017-02-04 3 views
2

私はいくつかのキャンバスに続いていますtutorial。以下のコードはそれの抜粋です。オブジェクトのプロパティとしてブール値とプリミティブの違いは何ですか?

なぜ、runAnimationを単純なブール値にすることを選択しないのですか?私はx = !xステートメントはとにかく動作すると思いますが、ブーリアンを使用するようにコードを変更しようとするとコードが機能しませんでした。

オブジェクトのプロパティとしてブール値とプリミティブの違いは何ですか?

/* 
    * define the runAnimation boolean as an object 
    * so that it can be modified by reference 
    */ 
    var runAnimation = { 
    value: false 
    }; 

    // add click listener to canvas 
    document.getElementById('myCanvas').addEventListener('click', function() { 
    // flip flag 
    runAnimation.value = !runAnimation.value; 

答えて

3

すべての引数は、JavaScriptでは "value"によって渡されます。つまり、引数が渡されると、変数に格納されているもののコピーが渡されます。 (ブール値など)

プリミティブ店彼らはなどを表す実際のデータプリミティブが渡される場合、データのコピーは、データの2つのコピーをもたらす、送信されます。 1つに変更を加えても、他のものには影響しません。

しかし、あなたは、オブジェクト、そのオブジェクトがを見つけることができる場所について変数店舗メモリ位置を保存するとき。引数としてオブジェクトを渡すと、メモリアドレスのコピーが渡されます。これらの場合、同じメモリアドレスを格納する2つの変数を使用することができます。したがって、どの変数を使用しても、同じオブジェクトが影響を受けます。

あなたのシナリオでは、ブール変数で確実に動作させることができますが、チュートリアルではそのデータをオブジェクトにカプセル化して、ブールデータのコピーが浮かび上がることはないようです誤って1つの変数を変更する可能性は低くなりますが、別の変数は変更されません。

// This function takes a single argument, which it calls "input" 
 
// This argument will be scoped to the function. 
 
function foo(input){ 
 
    // The function is going to alter the parameter it received 
 
    input = input + 77; 
 
    
 
    console.log(input); 
 
} 
 

 
// Here's a higher scoped variable also called "input" 
 
var input = 100; 
 

 
// We'll pass the higher scoped variable to the function 
 
foo(input); 
 

 
// Now, has the higher level scoped "input" been changed by the function? 
 
console.log(input); // 100 <-- No, it hasn't because primitives pass a copy of their data 
 

 
// ************************************************ 
 

 
// Now, we'll do roughly the same thing, but with objects, not primitives 
 
function foo2(obj){ 
 
    obj.someProp = 100; 
 
    console.log(obj.someProp); 
 
} 
 

 
var obj = { 
 
    someProp : 50 
 
}; 
 

 
foo2(obj); 
 

 
// Here, we see that the original object has been changed by the funciton we passed it to 
 
console.log(obj.someProp);

+0

おかげで、私は正しい線に沿って考えていた見て喜んだけど、まだかなりありませんでした。

ここではいくつかの基本的な例です。 例は非常に明確です。それは、計算の順序を欺くために()を使う数学のように、uacutallyなのです。 JSでは、オブジェクトを使用してスコープ/値渡しを不正行為することができます。 –

+0

まさに!それはそれについて考える良い方法です。 –

関連する問題