亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談JavaScript 函數(shù)參數(shù)傳遞到底是值傳遞還是引用傳遞

 更新時(shí)間:2016年08月23日 09:57:51   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇淺談JavaScript 函數(shù)參數(shù)傳遞到底是值傳遞還是引用傳遞。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

在傳統(tǒng)的觀念里,都認(rèn)為JavaScript函數(shù)傳遞的是引用傳遞(也稱之為指針傳遞),也有人認(rèn)為是值傳遞和引用傳遞都具備。那么JS的參數(shù)傳遞到底是怎么回事呢?事實(shí)上以下的演示也完全可以用于Java

首先來(lái)一個(gè)比較簡(jiǎn)單的,基本類型的傳遞:

function add(num){
  num+=10;
  return num;
}
num=10;
alert(add(num));
aelrt(num);
//輸出20,10

對(duì)于這里的輸出20,10,按照J(rèn)S的官方解釋就是在基本類型參數(shù)傳遞的時(shí)候,做了一件復(fù)制棧幀的拷貝動(dòng)作,這樣外部聲明的變量num和函數(shù)參數(shù)的num,擁有完全相同的值,但擁有完全不同的參數(shù)地址,兩者誰(shuí)都不認(rèn)識(shí)誰(shuí),在函數(shù)調(diào)用返回的時(shí)候彈出函數(shù)參數(shù)num棧幀。所以改變函數(shù)參數(shù)num,對(duì)原有的外部變量沒(méi)有一點(diǎn)影響。

再來(lái)看一個(gè)較復(fù)雜的,對(duì)象引用類型的傳遞:

function setName(obj){
  obj.name="ted";
}
var obj=new Object();
setName(obj);
alert(obj.name);
//輸出ted

以上代碼的運(yùn)行的實(shí)質(zhì)是:創(chuàng)建了一個(gè)object對(duì)象,將其引用賦給obj(在C里面就直接是一個(gè)內(nèi)存地址的賦值),然后在傳遞函數(shù)參數(shù)的時(shí)候,做了一件與前一個(gè)方法相同的事情,復(fù)制了一個(gè)棧幀給函數(shù)參數(shù)的obj,兩者擁有相同的值(不妨將其理解為object對(duì)象的地址),然后在setName做改變的時(shí)候,事實(shí)上是改變了object對(duì)象自身的值(在JAVA里稱之為可變類),在改變完成之后同樣也要彈出函數(shù)參數(shù)obj對(duì)應(yīng)的棧幀。

所以對(duì)應(yīng)的輸出是改變后object對(duì)象的值

那么可能有的朋友可能會(huì)問(wèn),這樣也可以理解為一個(gè)引用傳遞(指針傳遞)呀?不,這里嚴(yán)格的說(shuō),在和JAVA類似的語(yǔ)言中,已經(jīng)沒(méi)有了指針,在JAVA里將上述過(guò)程稱之為一個(gè)從符號(hào)引用到直接引用的解析過(guò)程。在C里面,指針就是一個(gè)具有固定長(zhǎng)度的類型(在大多數(shù)的C編譯器里是2個(gè)字節(jié)),但在JAVA類似的語(yǔ)言里,引用也有自己的屬性和方法,只是你不能直接去訪問(wèn)和控制它,所以它從某種意義上也是一種對(duì)象,這種機(jī)制也很大程度的避免了內(nèi)存泄露,術(shù)語(yǔ)稱之為內(nèi)存結(jié)構(gòu)化訪問(wèn)機(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

這個(gè)例子與上一個(gè)例子的唯一不同是這里將一個(gè)新的對(duì)象賦給了函數(shù)參數(shù)obj,這樣函數(shù)參數(shù)obj和原有的引用obj參數(shù),有著完全不同的值和內(nèi)存地址。

以上這篇淺談JavaScript 函數(shù)參數(shù)傳遞到底是值傳遞還是引用傳遞就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 純javascript實(shí)現(xiàn)簡(jiǎn)單下拉刷新功能

    純javascript實(shí)現(xiàn)簡(jiǎn)單下拉刷新功能

    這篇文章主要介紹了純javascript實(shí)現(xiàn)簡(jiǎn)單下拉刷新功能,沒(méi)有借助任何的框架,十分簡(jiǎn)單實(shí)用,有需要的小伙伴來(lái)參考下吧。
    2015-03-03
  • 原生js實(shí)現(xiàn)商品放大鏡效果

    原生js實(shí)現(xiàn)商品放大鏡效果

    本文主要分享了原生js實(shí)現(xiàn)商品放大鏡效果的示例代碼。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • js 創(chuàng)建對(duì)象 經(jīng)典模式全面了解

    js 創(chuàng)建對(duì)象 經(jīng)典模式全面了解

    下面小編就為大家?guī)?lái)一篇js 創(chuàng)建對(duì)象 經(jīng)典模式全面了解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • JS制作手機(jī)端自適應(yīng)縮放顯示

    JS制作手機(jī)端自適應(yīng)縮放顯示

    允許網(wǎng)頁(yè)寬度自動(dòng)調(diào)整的"自適應(yīng)網(wǎng)頁(yè)設(shè)計(jì)"到底是怎么做到的?下面我們就來(lái)通過(guò)示例來(lái)探討下。
    2015-06-06
  • javascript IE中的DOM ready應(yīng)用技巧

    javascript IE中的DOM ready應(yīng)用技巧

    當(dāng)我們想在頁(yè)面加載之后執(zhí)行某個(gè)函數(shù),肯定會(huì)想到onload了 但onload在瀏覽器看來(lái),就是頁(yè)面上的東西全部都加載完畢后才能發(fā)生,但那就為時(shí)已晚了。
    2008-07-07
  • JavaScript中播放音頻文件的幾種常用方法

    JavaScript中播放音頻文件的幾種常用方法

    JS可以用來(lái)播放多種聲音文件,包括常見(jiàn)的mp3、wav等格式,這篇文章主要給大家介紹了關(guān)于JavaScript中播放音頻文件的幾種常用方法,需要的朋友可以參考下
    2023-10-10
  • Javascript 陷阱 window全局對(duì)象

    Javascript 陷阱 window全局對(duì)象

    ff和ie6下都是同樣的運(yùn)行結(jié)果,看來(lái)不是bug,那究竟是為什么呢? 注意到:對(duì)象方法訪問(wèn)其對(duì)象的屬性時(shí)|必須|加以this.(和java不一樣).
    2008-11-11
  • JS顯示下拉列表框內(nèi)全部元素的方法

    JS顯示下拉列表框內(nèi)全部元素的方法

    這篇文章主要介紹了JS顯示下拉列表框內(nèi)全部元素的方法,涉及javascript遍歷下拉列表元素的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • JavaScript實(shí)例--創(chuàng)建一個(gè)歡迎cookie

    JavaScript實(shí)例--創(chuàng)建一個(gè)歡迎cookie

    這篇文章主要介紹了JavaScript實(shí)例--創(chuàng)建一個(gè)歡迎cookie,
    2022-01-01
  • js神秘的電報(bào)密碼 哈弗曼編碼實(shí)現(xiàn)

    js神秘的電報(bào)密碼 哈弗曼編碼實(shí)現(xiàn)

    這篇文章主要介紹了js神秘的電報(bào)密碼 哈弗曼編碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論