JavaScript 参数传递与变量复制
动态的属性
复制变量值
传递参数
在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,或者用ECMAScript 的概念来说,就是 arguments 对象中的一个元素)。
| 1 2 3 4 5 6 7 8 | functionaddTen(num){    num +=10;    returnnum;}varcount = 20;varresult = addTen(count);alert(count);   //20alert(result);  //30 | 
在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。传给函数的是数值的一个引用,函数中对其属性的修改外部可见,但用新引用覆盖其则在外部不可见。
| 1 2 3 4 5 6 | functionsetName(obj){    obj.name = "staven";}varperson = newObject();setName(person);alert(person.name);  //staven | 
普通赋值
| 1 2 3 4 | vara = 1;varb = a;   //赋的是a的复制值b ++;alert(a);   //"1"   b的修改不影响a | 
对象赋值
| 1 2 3 4 | vara = [1];varb = a;     //赋的是a的引用 b[0] ++;alert(a);  //"2"   b的修改对a也有效 | 
参数传值传递:传给函数的是数值的一个复制,函数中对其的修改外部不可见
| 1 2 3 4 5 6 7 8 9 10 11 12 | vara = 1;varb = 2;functionchange(a,b) {  varc = a;  a = b;      //用新引用覆盖  b = c;  alert(a);   //"2"           alert(b);   //"1"}change(a,b);alert(a);   //"1"         alert(b);   //"2" | 
传址的传递:传给函数的是数值的一个引用,函数中对其属性的修改外部可见,但用新引用覆盖其则在外部不可见
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | vara = [1, 2, 3];varb = [5, 6];functionchange(a,b) {  a[0] = 4;    //对其属性的修改外部可见    varc = a;  a = b;      //用新引用覆盖  b = c;  alert(a);   //"5,6"           alert(b);   //"4,2,3"}change(a,b);alert(a);    //"4,2,3"alert(b);     //"5,6" | 
a,b是change函数中的变量,在调用函数时传递了a,b的引用赋给了这两个变量,但是并不能改变全局中的a,b。因为用新引用覆盖在外部不可见,因为函数只是拿到了引用 并没有权力更改引用。
| 1 2 3 4 5 6 7 8 9 10 11 | vara = [1, 2, 3];varb = [5, 6];functionchange() {  varc = a;  a[0] = 4;  a = b;  b = c;};change();alert(a);   //"5,6"alert(b);   //"4,2,3" | 
又得提到js的块级作用域了,这个放某些语言里定然是要报未定义错误的,因为js没有块级作用域,所以它在change里找不到变量a,b就会自觉的到上层去找,所以这里的a,b是全局变量的引用。
| 1 2 3 4 5 6 7 8 | varadd_handlers = function(nodes) {    vari;    for(i = 0, l = nodes.length; i < l; i ++) {        nodes[i].onclick = function(e) {           alert(i);    // 当然这里的结果必然是每次alert的都是节点总数。。。。        }    }}; | 
此时i是父级函数作用域的变量的引用。给每个节点设置onclick事件的时候将i的引用传递给了alert,当我点击节点触发onclick事件的时候,i的值已经变成了节点总数。
| 1 2 3 4 5 6 7 8 9 10 11 | varadd_handlers = function(nodes) {    vari;    for(i = 0, l = nodes.length; i < l; i ++) {         nodes[i].onclick = function(i) {           returnfunction(){              alert(i);               }        }(i);    }}; | 
这样修改后之所以正确是因为此时传进去的是i的值的复制。
检测类型
| 1 2 3 4 5 6 7 8 | functionsetName(obj){    obj.name = "staven";    obj = newObject();    obj.name = "Bob";}varperson = newObject();setName(person);alert(person.name);     //staven | 
JavaScript 参数传递与变量复制的更多相关文章
- JavaScript变量复制
		1.基本类型复制变量: var num1=5: var num2=num1: num1和num2是相互独立,不会相互影响 2.引用类型从一个变量向另一个变量复制引用类型的值 两个变量指向同一个对象,所 ... 
- JavaScript高级程序设计(复制变量值、传递参数)
		复制变量值 一个变量向另一个变量复制基本类型值和引用类型值时,是存在不同的. 一个变量向另一个变量复制基本类型的值,会在变量的对象上创建一个新值,然后把该值复制到为新变量分配的位置上. var num ... 
- 一篇文章带你了解JavaScript中的变量,作用域和内存问题
		1 在JavaScript中的变量分别区分为两种: 一种为基本类型值,一种为应用类型值. 基本类型值指的是简单的数据段 引用类型值为可能由多个值组成的对象 引用类型的值是保存在内存中的对象,JavaS ... 
- javascript中关于深复制与浅复制的问题
		在javascript中,变量的类型分为基本类型和引用类型. 对于基本类型的变量来说,值的复制以及作为函数参数实参传递的过程都是值的复制传递,换句话说,是会在内存中开辟出一个新空间用于存放新的值的.这 ... 
- 深度解析javascript中的浅复制和深复制
		原文:深度解析javascript中的浅复制和深复制 在谈javascript的浅复制和深复制之前,我们有必要在来讨论下js的数据类型.我们都知道有Number,Boolean,String,Null ... 
- javascript中的变量、作用域和内存问题
		1.变量 变量的值的类型:基本类型值和引用类型值两种. 基本类型:Undefined.Null.Boolean.String.Number,这五类基本数据类型的值在内存中占有固定大小的空间,因此保存在 ... 
- 前端周报:前端面试题及答案总结;JavaScript参数传递的深入理解
		1.2017前端面试题及答案总结 |掘金技术征文 "金三银四,金九银十",用来形容求职最好的几个月.但是随着行业的饱和,初中级前端er就业形势不容乐观. 行业状态不可控,我们能做的 ... 
- this、apply/call、bind、闭包、函数、变量复制
		一.实际场景中抽象出的一个问题 下面this各指向什么? var a = { b: function() { console.log(this); }, f: function() { var c = ... 
- JavaScript中的变量在内存中的具体存储形式
		栈内存和堆内存 JavaScript中的变量分为基本类型和引用类型 基本类型是保存在栈内存中的简单数据段,它们的值都有固定的大小,保存在栈空间,通过按值访问 引用类型是保存在堆内存中的对象,值大小不固 ... 
随机推荐
- spring cloud教程之使用spring boot创建一个应用
			<7天学会spring cloud>第一天,熟悉spring boot,并使用spring boot创建一个应用. Spring Boot是Spring团队推出的新框架,它所使用的核心技术 ... 
- dom4j 使用总结
			dom4j是一个Java的XML API,类似于jdom,用来读写XML文件 dom4j的使用方法简单总结来说如下: ①可以创建一个新的xml文件 ②利用SAXReader和File对象创建一个已存在 ... 
- linux下安装openssh-server
			csdn博文地址:linux下安装openssh-server 点击进入 系统是ubuntu14.04,系统默认安装了openssh-client,但没有安装openssh-server,需要手动 ... 
- 编写高质量代码改善C#程序的157个建议[泛型集合、选择集合、集合的安全]
			前言 软件开发过程中,不可避免会用到集合,C#中的集合表现为数组和若干集合类.不管是数组还是集合类,它们都有各自的优缺点.如何使用好集合是我们在开发过程中必须掌握的技巧.不要小看这些技巧,一旦在开 ... 
- DOM系列---DOM操作样式
			发文不易,若转载传播,请亲注明出处,谢谢! 一.操作样式 CSS作为(X)HTML的辅助,可以增强页面的显示效果.但不是每个浏览器都能支持最新的CSS能力.CSS的能力和DOM级别密切相关,所以我们有 ... 
- datepicker自定义 -- iOS
			/** * 创建时间选择器 */ - (void)createPickerView { self.datePicker = [[UIDatePicker alloc] init]; _datePick ... 
- android常用的弹出提示框
			我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其他平台开发经验的朋友都会知道,大部分的平台都只提供了几个最简单的实现,如果我们想实现自己特定需求的对话框,大家可能首先会想到,通过继承等 ... 
- HDU 5976 Detachment 打表找规律
			题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5976 Detachment Time Limit: 4000/2000 MS (Java/Other ... 
- android学习——error opening trace file: No such file or directory (2)
			1.疑惑: 程序运行起来的时候日志总是显示下面这个错误,但是不影响程序的正常进行,我是用真机来测试的,android4.4.4(API17). 02-11 14:55:03.629 15525-155 ... 
- 传智168期JavaEE就业班 day05-XML 约束与解析
			* 课程回顾: * DOM解析HTML简介 * DOM 文档对象模型 * 解析器 * document对象 * getElementById("id的值"); 返回一个元素(标签) ... 
