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