淺談JavaScript 函數(shù)參數(shù)傳遞到底是值傳遞還是引用傳遞
在傳統(tǒng)的觀念里,都認(rèn)為JavaScript函數(shù)傳遞的是引用傳遞(也稱之為指針傳遞),也有人認(rèn)為是值傳遞和引用傳遞都具備。那么JS的參數(shù)傳遞到底是怎么回事呢?事實上以下的演示也完全可以用于Java
首先來一個比較簡單的,基本類型的傳遞:
function add(num){ num+=10; return num; } num=10; alert(add(num)); aelrt(num); //輸出20,10
對于這里的輸出20,10,按照J(rèn)S的官方解釋就是在基本類型參數(shù)傳遞的時候,做了一件復(fù)制棧幀的拷貝動作,這樣外部聲明的變量num和函數(shù)參數(shù)的num,擁有完全相同的值,但擁有完全不同的參數(shù)地址,兩者誰都不認(rèn)識誰,在函數(shù)調(diào)用返回的時候彈出函數(shù)參數(shù)num棧幀。所以改變函數(shù)參數(shù)num,對原有的外部變量沒有一點(diǎn)影響。
再來看一個較復(fù)雜的,對象引用類型的傳遞:
function setName(obj){ obj.name="ted"; } var obj=new Object(); setName(obj); alert(obj.name); //輸出ted
以上代碼的運(yùn)行的實質(zhì)是:創(chuàng)建了一個object對象,將其引用賦給obj(在C里面就直接是一個內(nèi)存地址的賦值),然后在傳遞函數(shù)參數(shù)的時候,做了一件與前一個方法相同的事情,復(fù)制了一個棧幀給函數(shù)參數(shù)的obj,兩者擁有相同的值(不妨將其理解為object對象的地址),然后在setName做改變的時候,事實上是改變了object對象自身的值(在JAVA里稱之為可變類),在改變完成之后同樣也要彈出函數(shù)參數(shù)obj對應(yīng)的棧幀。
所以對應(yīng)的輸出是改變后object對象的值
那么可能有的朋友可能會問,這樣也可以理解為一個引用傳遞(指針傳遞)呀?不,這里嚴(yán)格的說,在和JAVA類似的語言中,已經(jīng)沒有了指針,在JAVA里將上述過程稱之為一個從符號引用到直接引用的解析過程。在C里面,指針就是一個具有固定長度的類型(在大多數(shù)的C編譯器里是2個字節(jié)),但在JAVA類似的語言里,引用也有自己的屬性和方法,只是你不能直接去訪問和控制它,所以它從某種意義上也是一種對象,這種機(jī)制也很大程度的避免了內(nèi)存泄露,術(shù)語稱之為內(nèi)存結(jié)構(gòu)化訪問機(jī)制。
為了證明上述觀點(diǎn),稍微改造下上述例子:
function setName(obj){ obj.name="ted"; obj=new Object(); obj.name="marry"; } var obj=new Object(); setName(obj); alert(obj.name); //輸出ted
這個例子與上一個例子的唯一不同是這里將一個新的對象賦給了函數(shù)參數(shù)obj,這樣函數(shù)參數(shù)obj和原有的引用obj參數(shù),有著完全不同的值和內(nèi)存地址。
以上這篇淺談JavaScript 函數(shù)參數(shù)傳遞到底是值傳遞還是引用傳遞就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
js 創(chuàng)建對象 經(jīng)典模式全面了解
下面小編就為大家?guī)硪黄猨s 創(chuàng)建對象 經(jīng)典模式全面了解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08javascript IE中的DOM ready應(yīng)用技巧
當(dāng)我們想在頁面加載之后執(zhí)行某個函數(shù),肯定會想到onload了 但onload在瀏覽器看來,就是頁面上的東西全部都加載完畢后才能發(fā)生,但那就為時已晚了。2008-07-07JavaScript實例--創(chuàng)建一個歡迎cookie
這篇文章主要介紹了JavaScript實例--創(chuàng)建一個歡迎cookie,2022-01-01