怎么理解JS函數參數是按值傳遞
我們先來看一下這道題:
js">var a=[1,2,3];
function fn(b){
b=[4,5,6];
}
fn(a);
console.log(a); //請問a 輸出多少
我們接下來再看一道題:
var obj={

name:'大雄'
};
function fn(b){
b.name='小熊'
}
fn(obj);
console.log(obj.name); // 輸出多少
第一道題答案:[1,2,3];
第二道題答案:小熊;
怎么樣你都答對了嗎?
接下來我們詳解一下為什么
《 高級程序設計》第三版中有這么一句話 中所有函數的參數都是按值傳遞的
但是從第二道題我們明顯感覺到:就是按照引用傳遞的啊;首先我們都知道,js 中的類型分為 值類型和引用類型不同js文件之間傳值,值類型保存在內存棧中,引用類型保存在內存堆中;
我們看一下 下面的這段代碼:
var a={
name:'大雄'
};

var b=a;
b.name='小熊';
console.log(a.name);
這段代碼的執行結果想必大家都知道,因為a 保存的是一個堆指針,b賦值后指向了同一個堆內存;
我們現在理解下:函數都是按值傳遞的;
var a={};
function fn(b){

b=2;
}
fn(a);
//這段代碼中函數的參數傳遞相當于如下代碼
function fn(b){
var b=a; // 對參數進行了復制;在棧內存在開辟了空間;
}
所以說:值傳遞 可以理解為復制變量值,基本類型復制后倆個變量完全獨立;引用類型復制的是引用(即指針),之后的任何一方改變都會映射到另一方;
我相信說到這里第二道題的答案大家應該都明白了,接下來我們看一下第一道題:
// 第一題 相當于如下的代碼
function fn(b){
var b=a; // b與a 指向了同一個堆內存;
b=[4,5,6]; // 并沒有改變指針的內容;而是開辟了一個新的堆空間;所以a,b 就不相互影響了;
};
我們用圖說明一下:
結合圖和代碼,我們對程序的執行一目了然不同js文件之間傳值,相信大家都明白了。
所以說js中函數的參數都是按值傳遞的
希望能給大家講明白,有問題歡迎留言,點贊,評論。