2013-04-05 77 views
7

我想了解引用,值和名稱之間的概念區別。通過引用,值和名稱調用

所以,我有以下僞代碼:

foo(a, b, c) 
{ 
    b =b++; 
    a = a++; 
    c = a + b*10 
} 

X=1; 
Y=2; 
Z=3; 
foo(X, Y+2, Z); 

什麼是X,Y,和foo的調用後ž如果A,B和C是參照所有的呼叫? 如果a,b和c是按值/結果? 如果a,b和c是按名稱調用?

另一種情形:

X=1; 
Y=2; 
Z=3; 
foo(X, Y+2, X); 

我試圖得到一個頭對即將到來的最終研究開始,這似乎是一個很好的複習題走了過來。名字傳遞對我來說絕對是最陌生的。

+2

將鼠標懸停在標籤上,然後查看說明。我從來沒有聽說過名字傳遞,除非這是某種反思。 – 2013-04-05 00:17:01

+0

按名稱傳遞:http://stackoverflow.com/questions/838079/what-is-pass-by-name-and-how-does-it-work-exactly – 2013-04-05 00:17:25

+1

你知道指針是什麼嗎?按引用傳遞只是傳遞一個指針,而傳遞值是傳遞值本身。 – Pithikos 2013-04-05 00:17:26

回答

5

當您通過值傳遞參數時,它只是複製函數參數中的值,並且該函數內的任何操作都不會反映原始變量,例如

foo(a, b, c) 
{ 
    b =b++; 
    a = a++; 
    c = a + b*10 
} 

X=1; 
Y=2; 
Z=3; 
foo(X, Y+2, Z); 
//printing will print the unchanged values because variables were sent by value so any //changes made to the variables in foo doesn't affect the original. 
print X; //prints 1 
print Y; //prints 2 
print Z; //prints 3 

但是,當我們通過參考發送參數,變量其中它複製地址意味着無論我們做什麼用的函數中的變量,則在原來的內存位置實際上做了如

foo(a, b, c) 
{ 
    b =b++; 
    a = a++; 
    c = a + b*10 
} 

X=1; 
Y=2; 
Z=3; 
foo(X, Y+2, Z); 

print X; //prints 2 
print Y; //prints 5 
print Z; //prints 52 

通過名稱; Pass-by-name

+0

用於傳遞引用,傳遞的內容必須是左值(即可賦值)。 'Y + 2'不是左值,所以我不確定分配給它的意思。 – newacct 2013-04-05 18:50:41

0

如果按值傳遞,這將不會更改X,Y或Z的值。當您使用諸如「foo()」之類的函數時,它基本上將變量(x,y和z)複製到其他變量(a,b和c)中,並對它們執行某些操作,而不更改原始(x, y和z)。爲你改變一個值,你就必須返回一個值,像這樣:

foo(a, b, c) 
{ 
a = a++; 
b = b++; 
c = a + b * 10; 
return c; 
} 

x = 1; 
y = 2; 
z = 3; 
z = foo(x, y+2) 

那麼x和y是相同的,但ž將是(X + 1)+(Y + 1)* 10在這種情況下將是32.

1

按值 - 功能沒有變化。當功能完成後,所有的操作都會消失。

參考 - 你的行爲確實改變了變量。 通過名字 - 我從來沒有聽說過...

傳X + 1沒有改變,只是告訴給函數3而不是2或等等

0
在JavaScript

  1. 原始類型變量如字符串,數字總是按值通過 。
  2. 數組和對象作爲引用傳遞或根據這些條件傳遞值。

    • 如果您正在使用新的對象或數組更改該對象或數組的值,那麼它將通過值傳遞。

      object1 = {item: "car"}; array1=[1,2,3];

    這裏要指定新的對象或array.you沒有改變的舊的所有制 值object.so它是按值傳遞。

    • 如果您正在更改對象或數組的屬性值,那麼它將通過引用傳遞。

      object1.item= "car"; array1[0]=9;

    這裏你改變的舊屬性值object.you不分配新的對象或數組老one.so它是通過引用傳遞。

代碼

function passVar(object1, object2, number1) { 

     object1.key1= "laptop"; 
     object2 = { 
      key2: "computer" 
     }; 
     number1 = number1 + 1; 
    } 

    var object1 = { 
     key1: "car" 
    }; 
    var object2 = { 
     key2: "bike" 
    }; 
    var number1 = 10; 

    passVar(object1, object2, number1); 
    console.log(object1.key1); 
    console.log(object2.key2); 
    console.log(number1); 

Output: - 
    laptop 
    bike 
    10 
2

打電話值:正常的方式...實際參數的值複製到形式參數。

以引用方式調用:代替參數,它們的地址被傳遞並且形式參數指向實際參數。

按名稱調用:與宏一樣,整個函數定義代替函數調用,形式參數只是實際參數的另一個名稱。