JS函数参数都是按值传递的!
2016-09-12 20:09
295 查看
访问变量有按值和按引用两种方式,但参数只能按值传递
在向参数传递基本类型的值时,被传递的值会被复制给命名参数,即arguments对象数组的中一个元素。在向参数传递引用类型的值时,会把这个值在内存的地址传递给命名参数即函数内的局部变量,此时若局部变量变化则可以影响到函数外部。
基本类型传值比较好理解,下面给出一个书中引用类型传值的例子:
看起来似乎是把person对象整个传递给了参数,所以才导致了全局作用域中的对象变化,但其实person还是按值传递的,请看下面这个例子:
分析以上代码,用反证法证明,假设person是按引用传递的参数,则在函数中name属性已经被赋值“greg”,所以结果应该为greg才对。
其实这正是因为person是按值传递的才会有这个结果,person传递进去的是person对象的地址,当参数传递进去后被object对象实例化,就指向了一个新object实例,不再是person原来的地址了,所以再赋值也不会影响到全局作用域中的person了。
所以person只是和setName.arguments[0]的值相同,或者指向同一个对象即地址相同,只是后者被看作为一个局部变量。
在向参数传递基本类型的值时,被传递的值会被复制给命名参数,即arguments对象数组的中一个元素。在向参数传递引用类型的值时,会把这个值在内存的地址传递给命名参数即函数内的局部变量,此时若局部变量变化则可以影响到函数外部。
基本类型传值比较好理解,下面给出一个书中引用类型传值的例子:
function setName(obj){ obj.name="nick"; } var person=new Object(); setName(person); alert(person.name); //"nick"
看起来似乎是把person对象整个传递给了参数,所以才导致了全局作用域中的对象变化,但其实person还是按值传递的,请看下面这个例子:
function setName(obj){ obj.name="nick"; obj=new Object(); obj.name="greg"; } var person=new Object(); setName(person); alert(person.name); //"nick"
分析以上代码,用反证法证明,假设person是按引用传递的参数,则在函数中name属性已经被赋值“greg”,所以结果应该为greg才对。
其实这正是因为person是按值传递的才会有这个结果,person传递进去的是person对象的地址,当参数传递进去后被object对象实例化,就指向了一个新object实例,不再是person原来的地址了,所以再赋值也不会影响到全局作用域中的person了。
所以person只是和setName.arguments[0]的值相同,或者指向同一个对象即地址相同,只是后者被看作为一个局部变量。
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- Python动态类型的学习---引用的理解
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 设计模式---状态模式在web前端中的应用
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法