JS中函数参数的传递
2016-04-08 10:17
288 查看
之前看书对这个问题理解的不透彻,这次偶然间翻到了一篇博客,加深了理解,这里记录一下。
ECMAScript中所有函数的参数是按值传递的。
在向函数传递基本类型的值时候,这个值被复制到了函数的参数局部变量中。而传递引用类型的值的时候,这个值在内存中的地址被复制给了参数中的局部变量,因此这个局部变量的值的变化会反映在函数的外部。
基本类型值的传递
另外一个例子:
从这个例子里可以看到,在foo函数里边对o1,o2进行直接的赋值操作,然后在函数外部访问,没有起到效果。原因就是在函数内部改写了局部函数的指向,指向了新的数组和对象,所以没有效果。
上边在修改局部变量的时候,访问的是函数的属性,这时就可以成功的修改传入参数了。
ECMAScript中所有函数的参数是按值传递的。
在向函数传递基本类型的值时候,这个值被复制到了函数的参数局部变量中。而传递引用类型的值的时候,这个值在内存中的地址被复制给了参数中的局部变量,因此这个局部变量的值的变化会反映在函数的外部。
基本类型值的传递
<span style="color:#000000;">function addTen(num){ return num+=10; } var count = 20; var result = addTen(count); alert(count); //20 alert(result); //30</span>这里看到count被当做参数传进addTen函数里边,并做了加10的操作,之后在函数外边分别访问了count和addTen返回值,count没变,返回值位count+10。这里就说明了当基本类型的值传递给函数参数的时候,只是将值复制给了函数参数。
引用类型值的传递
function setName(obj){ obj.name = 'xiaoming'; obj = new Object(); obj.name = 'xiaoqiang;' } var person = new Object(); person.setName(person); alert(obj.name); //xiaoming这里将person对象传递到了setName函数中,person的地址就被复制给了obj,因此当第一次访问obj.name时,访问的是person.name。之后obj指向了一个新的对象的地址,这时再访问name属性就不是函数参数obj了,而是另外一个新的对象,当函数运行结束时,这个新的对象也就被销毁了。
另外一个例子:
var o1 = [] var o2 = {}; function foo(o1, o2) { o1 = [1]; o2 = {a:3} } foo(o1, o2); alert (o1); // 空白 alert (o2.a); // undefined
从这个例子里可以看到,在foo函数里边对o1,o2进行直接的赋值操作,然后在函数外部访问,没有起到效果。原因就是在函数内部改写了局部函数的指向,指向了新的数组和对象,所以没有效果。
function get(value,arr){ console.log(1); } var o1 = [] var o2 = {}; function foo(o1, o2) { o1[0] = 1; o2.a = 3; } foo(o1, o2); console.log(o1); // [1] console.log(o2.a); // 3
上边在修改局部变量的时候,访问的是函数的属性,这时就可以成功的修改传入参数了。
相关文章推荐
- json
- JS在页面Frame和子Frame之间的调用
- json2xlsx AND xlsx2json 接口
- js动态生成css代码
- JSP中四种传递参数中文乱码问题
- Js的引用关系示例和总结
- 超简单的js题 学习笔记
- JS 重新加载当前页面或者父页面
- JS----简单表单密码强度检验
- JSTL标签库简介
- ExtJS实现Excel导出
- 模块化JavaScript设计模式(一)
- js 截取字符串
- JSON资料整理(转)
- 页面缓存js问题解决
- 用js导出页面table到excel表中
- 关于fancybox大图片显示位置不准确的问题解决方案
- JS异步编程
- JavaScript代码实现左右上下自动晃动自动移动
- ExtJS小技巧