亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

死磕JavaScript-函數按值傳遞參數

標簽:
JavaScript

早起打卡,今天死磕函数按值传递参数,干货走起......

基本类型的变量传递是将值A复制一份给被传递的变量B,两个变量值得变化是互不干扰的;而引用类型的变量传递是将引用类型变量A的引用传递给被传递的变量B,这个B的变化会反映到A上。例如:

例1:

function addTen(num){
     num += 10;
     return num;
}
var count = 20;
var result = addTen(count);
console.log(count);//20
console.log(result);//30

例2:

function setName(obj){
     obj.name = "javaScript";
}
var language = new Object();
setName(language);
console.log(language.name);//javaScript

这两种函数的值传递是比较好理解的,在例1中,num其实是addTen的局部变量,在调用addTen函数的时候,count将值复制给了局部变量num,虽然函数内部num的值加了10,但是这一变化不会影响给函数外部的count变量。复制前后栈的变化图如下:
图片描述

在例2中你可能有所疑惑,因为这看起来就像是引用传递啊,不像是标题所说的函数按值传递,这里language的引用复制传递给了obj局部变量,所以是引用传递呀。那我们来看下一个例子:
例3:

function setName(obj){
     obj.name = "javaScript";
     obj = new Object();
     obj.name = "new JavaScript";
}
var language = new Object();
setName(language);
console.log(language.name);//javaScript

如果说language是按引用传递的,那么language就会自动被修改为指向其name属性值为“new JavaScript”的新对象,但结果确实“javaScript”,我们看下复制前后的栈和堆的变化图就能更清楚了。图片描述

这下应该能明白了,也就是说这里的函数按值传递中的“值”指的是栈中的值,所以对于引用类型,是将栈中的language的值复制到obj中,也就是说这两个值对应的堆地址是一样的,其在堆中对应的对象是一样的,对obj中的改变对反映到language中,但如果改变了obj的堆地址那么obj和language就没什么关系了。

點擊查看更多內容
1人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
算法工程師
手記
粉絲
1532
獲贊與收藏
2735

關注作者,訂閱最新文章

閱讀免費教程

感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消