之前看了很多人的解释,说js中,函数的参数传递都是值传递中不理解。

他们无非举了两个例子

在这两个例子中,第二个例子可以看出参数是由值传递的。因为函数内对象的变化没有影响到函数外对象的变化。但是在第一个例子中,我们却发现,函数内和函数外都指向了一个地址。但是博主并没有说明

既然是值传递,为什么参数里面的改变却影响了外面的值。博主只解释了第二个例子是值传递,却没有解释第一个例子为什么会出现这样的原因,只是一句两个变量指向一个对象

就一笔带过,我觉得这个并没有解决大多数人的理解。所以我觉查看了js高级程序设计的原话。

《js高级程序设计》上是这样叙述参数传递的:所有函数的参数都是按值传递的

这段话摘抄自第四章的第一章节的传递参数。

这里解释一下,值传递。值传递就是传进来的参数中,我们传递的是一个值,而不是一个指针。

其实。为什么第一个例子中,两个变量指向的是一个对象。原因很简单,就是因为这里的参数传递的本来就是一个地址。这似乎和之前说的所有参数都是值传递相违背。觉得既然是值传递应该传递的是一个对象,然后在参数中建立一个这个对象的副本。其实这是一种错误的理解。

这里需要解释一下值传递,什么是值传递。值传递就是说,参数传递的是其中的值,然后这个值在函数中会建立一个副本,在函数内操作参数的其实是这个副本,而不是函数外传递的变量。

而js函数机制中,函数传递的参数,会把参数的值存储在arguments(这个数组是函数对象自带的数组,用来保存参数值)这个数组中,我们操作的参数,其实是这个数组中的值。这里就从本质上解释了js函数是值传递。

了解这个我们就可以说为什么第一个例子中所出现的现象了。因为,对象参数传递的,本身就是一个地址,他并不是一个对象。

这里可能还会疑惑,既然是传递的地址为什么还叫做值传递。

我们可以通过一幅图来理解

在这里,当a被当做参数时,a中的值也就是地址,被传递进了arguments这个数组中,而值传递和引用传递,指的其实对于这个地址来说的。

值传递,   就是传递a的值,a的值其实就是指向Object的地址。

如果是

引用传递,传递的是a的地址,也就是指向a的地址。如果了解c语言就可以对这个明白了。

a中保存的是指向对象的一个指针,在引用传递中,会传递一个指向a的指针。

所以这就解释了为什么会出现两个例子中这个看似很矛盾的的原因了。

值传递还是引用传递,他所说的并不是a指向的对象的传递方式,而仅仅是a的传递方式。

这是自己的理解,我觉得这样的理解对我来说才彻底解释了我之前感觉两个例子的矛盾的原因

关于js参数传递矛盾新理解的更多相关文章

  1. js参数arguments的理解

    原文地址:js参数arguments的理解 对于函数的参数而言,如下例子 function say(name, msg){ alert(name + 'say' + msg); } say('xiao ...

  2. js赋值运算的理解

    简介 js引擎由于为了效率,很多时候的非直接量赋值都不是copy一份在赋值给新的变量,而是一个引用 ps:直接量:直接值数字字符串等 为什么使用len = doms.length; 里的len效率要比 ...

  3. js 模块化的一些理解和es6模块化学习

    模块化 1 IIFE 2 commonjs 3 浏览器中js的模块化 4 简单理解模块加载器的原理  5 es6 之前在参加百度前端技术学院做的小题目的时候,自己写模块的时候 都是写成立即调用表达式( ...

  4. 前端周报:前端面试题及答案总结;JavaScript参数传递的深入理解

    1.2017前端面试题及答案总结 |掘金技术征文 "金三银四,金九银十",用来形容求职最好的几个月.但是随着行业的饱和,初中级前端er就业形势不容乐观. 行业状态不可控,我们能做的 ...

  5. Node.js Event Loop 的理解 Timers,process.nextTick()

    写这篇文章的目的是将自己对该文章的理解做一个记录,官方文档链接The Node.js Event Loop, Timers, and process.nextTick() 文章内容可能有错误理解的地方 ...

  6. js原型浅谈理解

    之前在学习原型(prototype)的时候,一直对原型的理解不是很清晰,只是知道每个对象都有一个原型,然后在js中万物又皆对象.在这里谈一下自己对于js原型的简单理解吧. 原型可以实现属性和方法的共享 ...

  7. 对js原型简单的理解和图解

    对js原型简单的理解和图解 最近在努力的学习js中,今天就抽了个空把自己理解的原型,记下一下在笔记中,以后自己查看,有空在会把原型链记录一下. 1.prototype prototype:是一个函数的 ...

  8. js回调函数的理解

    js回调函数(callback)理解 Mark! 讲之前说一句 function say(){ alert(,,,,,,,,) } var say=function (){ alert(,,,,,,, ...

  9. Js模块化开发的理解

    Js模块化开发的理解 模块化是一个语言发展的必经之路,其能够帮助开发者拆分和组织代码,随着前端技术的发展,前端编写的代码量也越来越大,就需要对代码有很好的管理,而模块化能够帮助开发者解决命名冲突.管理 ...

随机推荐

  1. ABP框架 - 嵌入资源

    文档目录 本节内容: 简介 创建嵌入文件 xproj/project.json 格式 csproj 格式 添加到嵌入式资源管理器 使用嵌入式视图 使用嵌入式资源 ASP.NET Core 配置 忽略文 ...

  2. window7 32位安装Oracle11g

    http://www.cnblogs.com/wangsaiming/p/3573509.html

  3. Codeforces Good Bye 2016 题解

    好久没有fst题了...比赛先A了前4题然后发现room里有人已经X完题了没办法只能去打E题,结果差一点点打完...然后C题fst掉了结果就掉rating 了...下面放题解 ### [A. New ...

  4. android学习11——Handler,Looper,MessageQueue工作原理

    Message是Handler接收和处理的消息对象. 每个线程只能拥有一个Looper.它的loop方法读取MessageQueue中的消息,读到消息之后就把消息交给发送该消息的Handler进行处理 ...

  5. java读取和写入txt文件

    package com.yinghuo.testDES; import java.io.BufferedReader;import java.io.BufferedWriter;import java ...

  6. 关于zepto在chrome中触发两次的解决方案

    复现条件:chrome 55+ 1.zepto tap的实现及double fire的原因 在监听DOM根节点的时候,touchStart后通过XY的坐标偏差,与tapTime的计时判断Tap/Lon ...

  7. C#同步,异步的理解,包括5.0中await和async(学习笔记)

    之前在工作中一直用的是同步线程,就是先进入画面的load事件,然后在里面进行数据库调用的处理.后面又遇到了公司软件中一些比较古老的代码,一开始在那块古老代码中增加机能的时候,我想用到数据库的数据给画面 ...

  8. 《Shell脚本学习指南》学习笔记之变量、判断和流程控制

    变量 定义变量 可以使用export和readonly来设置变量,export用于修改或打印环境变量,readonly则使得变量不得修改.语法: export name[=word] ... read ...

  9. 浅析=======Struts2之==========valueStack

    今天刚学习了struts2的valueStack,在这里把自己学到的做个分享,说道valueStack就不得不提OGNL表达式=== struts2工作流程 1.OGNL(Object Graph N ...

  10. [LeetCode]House Robber II (二次dp)

    213. House Robber II     Total Accepted: 24216 Total Submissions: 80632 Difficulty: Medium Note: Thi ...