DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> 關於JavaScript >> JavaScript傳遞變量: 值傳遞?引用傳遞?
JavaScript傳遞變量: 值傳遞?引用傳遞?
編輯:關於JavaScript     
當變量A賦值給變量B時,會將棧中的值復制一份到為新變量分配的空間中。

如何理解?
復制代碼 代碼如下:
var x = y = 1;
y = 2;
alert(x);

x的值為多少?
復制代碼 代碼如下:
var obj = {};
var sub = {};
sub['id'] = 3;
obj['sub'] = sub;
sub['id'] = 4;
alert(obj['sub']['id']);

obj['sub']['id']的值又為多少?他們真的符合你的預期嗎?

我們分別運行2段代碼,發現第1段程序中x的值沒有改變,而第2段程序中的obj['sub']['id']的值卻改變了。同樣是一個賦值操作,同樣是修改另外一份拷貝的值,為什麼一段程序源變量沒變,一段程序源變量變化了呢?這個傳遞到底是按值傳遞還是按引用傳遞的呢?

李松峰翻譯的《JavaScript 高級程序設計 第二版》中給出了答案。
在開始的這2個例子中,事實上都復制了A的值給B,不同的是,在第一個例子中,A的值是int型的1,而在第二個例子中,A的值是一個地址指針,這個地址指針可以訪問到一個對象,復制之後,第1個例子中的B的值變成了新的int, 他的值為1,而第2個例子中B的值變成了新的地址指針,他的值為這個對象的地址。

下面的例子可以幫助理解
復制代碼 代碼如下:
function setName(obj){
obj.name = "test1";
obj = {};
obj.name = "test2";
}
var person = new Object();
setName(person);
alert(person.name);

可以看到的是,盡管調用了setName函數修改了變量的name屬性,但是person.name的值並沒有改變。這是因為在函數中,obj指向的地址被改變了,因此修改這個地址的name屬性,並不會對原地址的name屬性造成影響。從另一個方面,也印證了JavaScript的傳遞是按值傳遞。
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved