摘要:但是又很多人困惑,因?yàn)樵L問變量有按值和按引用兩種方式,而參數(shù)只能按值傳遞。如果是按引用傳遞,那么變量將會(huì)變成,從而反應(yīng)函數(shù)內(nèi)部的修改。即使這個(gè)對象是按值傳遞的,也會(huì)按引用來訪問同一個(gè)對象。而這個(gè)局部對象會(huì)在函數(shù)執(zhí)行完后立即銷毀。
ECMAscript中所有的函數(shù)的參數(shù)都是按值傳遞的
把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù),就和把值從一個(gè)變量復(fù)制到另一個(gè)變量一樣。但是又很多人困惑,因?yàn)樵L問變量有按值和按引用兩種方式,而參數(shù)只能按值傳遞。
1.使用數(shù)值等基本類型值來說明按值傳遞
function addTen(num){ num += 10; return num; } var count = 20; var result = addTen(count); console.log(count);//20,沒有變化 console.log(result);//30
這里的addTen()有一個(gè)參數(shù)num,而參數(shù)實(shí)際上是函數(shù)的局部變量。在調(diào)用這個(gè)函數(shù)時(shí),變量count作為參數(shù)被傳遞給函數(shù),這個(gè)變量的值是20。因此數(shù)值20倍賦值給參數(shù)num以便在addTen中使用。在函數(shù)內(nèi)部,參數(shù)num被加上了10,但這一變化并不會(huì)影響函數(shù)外部的count變量。參數(shù)num與變量count互不認(rèn)識(shí),他們僅僅是具有相同的值。如果num是按引用傳遞,那么變量count將會(huì)變成30,從而反應(yīng)函數(shù)內(nèi)部的修改。
2.使用對象來說明按值傳遞參數(shù)
function setName(obj){ obj.name = "lihua"; } var person = new Object(); setName(person); console.log(person.name);//lihua
代碼將新創(chuàng)建的對象保存在person中,然后這個(gè)對象被傳遞到setName()函數(shù)之后就被復(fù)制給了obj。在這個(gè)函數(shù)內(nèi)部obj和person引用的是同一個(gè)對象。即使這個(gè)對象是按值傳遞的,obj也會(huì)按引用來訪問同一個(gè)對象。因此在函數(shù)內(nèi)部為obj添加一個(gè)name屬性后,函數(shù)外不person也將有所反映;因?yàn)閜erson指向得對象在堆內(nèi)存中只有一個(gè),而且是全局對象。因此許多人錯(cuò)誤的認(rèn)為在局部作用域中修改的對象會(huì)在全局作用域中反映出來,就說明參數(shù)使按引用傳遞的,為了證明對象是按值傳遞的,再看下一組代碼。
function setName(obj){ obj.name = "lihua"; obj = new Object(); obj.name = "xiaohua"; } var person = new Object(); setName(person); console.log(person.name);//lihua
與上一個(gè)例子的區(qū)別,就是在setName()中加了兩行代碼,一行為obj重新定義了一個(gè)對象,另一行代碼為該對象定義了一個(gè)帶有不同的name屬性,再把person傳遞給函數(shù)setName后,name屬性被設(shè)置為lihua。然后再將一個(gè)新對象賦值給變量obj,同時(shí)將其name屬性設(shè)置為xiaohua。如果person是按引用傳遞的,那么person就會(huì)自動(dòng)被修改為指向其name屬性值為xiaohua的新對象,但是當(dāng)接下來訪問person.name時(shí),顯示的仍然是lihua,這說明即使在函數(shù)內(nèi)部修改了參數(shù)的值,但原始的引用仍然保持未變。實(shí)際上當(dāng)函數(shù)內(nèi)部重寫obj時(shí),這個(gè)變量引用的就是一個(gè)局部對象了。而這個(gè)局部對象會(huì)在函數(shù)執(zhí)行完后立即銷毀。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95507.html
摘要:中所有函數(shù)的參數(shù)都是按值傳遞的?;绢愋捅旧硎前粗祩鬟f,具有不可變性,對基本類型的修改,實(shí)質(zhì)上都是在棧內(nèi)存中創(chuàng)建了新的值。中把這種拷貝也認(rèn)為是按值傳遞。 本文共 1200 字,讀完只需 5 分鐘 概述 參數(shù)的傳遞分為按值傳遞和按引用傳遞,而 JavaScript 中參數(shù)的傳遞只有按值傳遞。 ECMAScript 中所有函數(shù)的參數(shù)都是按值傳遞的。 所謂按值傳遞就是: 把函數(shù)外部的值復(fù)制給...
摘要:關(guān)于的求值策略,問中函數(shù)的參數(shù)傳遞是按值傳遞還是按引用傳遞回答很經(jīng)典。所以不能說中函數(shù)的參數(shù)傳遞嚴(yán)格按值傳遞或按引入傳遞。中還采用一種參數(shù)傳遞策略,叫按共享傳遞。中參數(shù)是必須先求值再作為實(shí)參傳入函數(shù)的。參考求值策略中函數(shù)參數(shù)的默認(rèn)值 最近在研究 lambda 演算中的 η-變換 在 JavaScript 中的應(yīng)用,偶然在 stackoverflow 上看到一個(gè)比較有意思的問題。關(guān)于 J...
摘要:棧內(nèi)存與堆內(nèi)存簡單類型的值,它們的值直接存儲(chǔ)在變量訪問的位置,這是因?yàn)檫@些簡單類型占據(jù)的空間是固定的,所以可將他們存儲(chǔ)在較小的內(nèi)存區(qū)域棧中。 看到一個(gè)這樣的問題 function setName(obj) { obj.name = Tom; obj = new Object(); obj.name = Greg ; } var person = new Object();...
摘要:棧內(nèi)存與堆內(nèi)存簡單類型的值,它們的值直接存儲(chǔ)在變量訪問的位置,這是因?yàn)檫@些簡單類型占據(jù)的空間是固定的,所以可將他們存儲(chǔ)在較小的內(nèi)存區(qū)域棧中。 看到一個(gè)這樣的問題 function setName(obj) { obj.name = Tom; obj = new Object(); obj.name = Greg ; } var person = new Object();...
摘要:深入系列第九篇,除了按值傳遞引用傳遞,還有第三種傳遞方式按共享傳遞定義在高級程序設(shè)計(jì)第三版,講到傳遞參數(shù)中所有函數(shù)的參數(shù)都是按值傳遞的。 JavaScript深入系列第九篇,除了按值傳遞、引用傳遞,還有第三種傳遞方式 —— 按共享傳遞 定義 在《JavaScript高級程序設(shè)計(jì)》第三版 4.1.3,講到傳遞參數(shù): ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的。 什么是按值傳遞呢?...
閱讀 3719·2021-10-18 13:34
閱讀 2413·2021-08-11 11:15
閱讀 1207·2019-08-30 15:44
閱讀 699·2019-08-26 10:32
閱讀 994·2019-08-26 10:13
閱讀 2069·2019-08-23 18:36
閱讀 1781·2019-08-23 18:35
閱讀 531·2019-08-23 17:10