从一个例子误区来理解JavaScript是按照值传递参数

关键字:参数值的传递、基本类型值、引用类型值、执行环境、垃圾回收、作用域链、闭包

  • 本文理顺自己的理解:函数的参数传递引用类型值中的一个误区:局部作用域中修改的对象会在全局作用域中反映出来,就说明参数是按照引用传递的;
function addProp(obj){
obj.name='lily';
}
var person =new Object();
addProp(person);
console.log(person.name);//lily
  • 作为局部变量的函数参数obj的属性name值改变了全局变量person的属性

  • 理解误区需要的概念:参考W3C

    • 基本类型值:指的是简单的数据段,比如Boolean、Number、String、Null、undefined
    • 引用类型值:由多个值构成的对象
  • 复制基本类型值过程:会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上

    • var x=5; var x=y;之后x与y就没有任何关系了就是两个独立的个体任何一方的改变不会对另一方造成影响
  • 复制引用类型值的过程:复制过程会将存储在变量对象中的值复制一份放到新变量分配的空间中,不同的是这个值时一个指针(或有着固定大小的地址段),而这个指针指向存储在内存中的一个对象,此时被复制和复制的变量都是有一个指针指向内存中的对象

    • 引用类型值得复制可以理解给一个人取两个名字,两个变量都有一个隐含和共同对象的关系
    • object1-------->Object<-----------object2
  • 用我们现在的知识看例子,在addProp中形参obj在函数调用时作为对象的person复制给了obj,此时两者就有了一个共同的引用指向Object,此时形参和实参会通过引用影响两者的属性,比如函数内部obj.name='lily',此时根据引用类型的复制规则,实参person也是增加了一个属性name;

  • 而这和我们处理基本数据类型的参数传递和复制的认知似乎不太一样,不太一样的原因主要是我们对于参数只能按值传递中值得理解和作用域链的规则理解:

    • 作用域:函数内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数,这些环境之间的联系是线性、有次序的;每个环境都可以向上搜索作用域,以查询变量和函数名;但任何环境都不能通过向下搜索作用域链而进入另一个执行环境。(来至高程3)
  • 参数传递引用类型值时,进行的是值得复制,而并没有破坏作用域链的规则

  • 同时局部作用域中修改的对象会在全局作用域中反映出来,和参数只按照值传递也并不冲突,因为我们实参和形参是复制的地址,指向同一个对象的地址,这个地址才是高程3所讲到的值

  • 再用例子理解一遍:

var obj1 = {
  value:'111'
};
 
var obj2 = {
  value:'222'
};
 
function changeStuff(obj){
  obj.value = '333';//obj1和obj此时指向同一个对象,obj属性的概念必然影响obj1,按照对象复制原则
  obj = obj2;//obj的引用被初始化改成了引用另外一个对象
  return obj.value;
}
 
 
var foo = changeStuff(obj1);
 
console.log(foo);// '222' 参数obj指向了新的对象obj2
console.log(obj1.value);//'333'


  • 再看这个例子
var v1 = []
var v2 = {};
var v3 = {};
function foo(v1, v2, v3)
{
    v1 = [1];
    v2 = [2];
    v3 = {a:3}
}

foo(v1, v2, v3);
alert(v1); // 空白
alert(v2); // [object Object]
alert(v3.a); // undefined
<!-- 解析:执行foo();实参和形参完成地址的复制,函数体内的v1,v2,v3是三个对象的指向了另外一个对象,可以理解为重新声明了一下,初始化了,但对于外层的三个参数没影响,其指针没变 -->
  • 再来理解下高程3给的结论,看是否理解
  • 高程3给出的结论是:访问变量有按照值和按引用访问两种方式,而函数参数只能按值传递
  • 高程3给的另一个结论:在向参数传递引用类型的值时,会把这个值的内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部
  • 总结
    • 好了到此我算是把为何在参数传递引用类型值的时看似全局变量更改了局部变量这个错误的认知给改过来了,而文中开头的那句话我也在通过查资料了解到,参数是按引用传递这个概念在js中完全去忽略它,按照js正常的规则去理解js的内容即可,这个概念可能存在于java或者c++中,而因为时间有限将来再研究。
    • 其实在解说这个问题的过程中我刻意的避免用内存中的栈和堆等概念去解释而是用js的原则解释,大部分网上的理解都是从栈和堆解释整个过程,整个过程还涉及到以下概念:内存垃圾回收,执行环境,解除引用等概念,我想您先通过上述的理解之后再来进一步理解内存中的概念进而去回看一些在js进阶中碰到的作用域链和闭包非常的有帮助,最起码你会有一个清晰的角度知道你不理解是这个方向的概念不理解,找资料即可,没啥难得。
    • 啰嗦一句:再理一下我解决这个问题的思路,首先我把高程3关于p70-p71反复看了四遍,还是感觉有点模糊,不是那种很爽的通透感,我就google了一下,找到了内存的理解,原来这个理解的方向是内存,这个是我之前没有的概念,后面就是顺着内存这条线整体算是清楚了,为何没用内存去讲解除了训练我自己是否真正理解这个概念之外,还有就是内存看了几篇文章感觉还不能完全说透
  • 参考文献和关于内存将来要看的内容如下:
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352