JavaScript 参数传递与变量复制
动态的属性
复制变量值
传递参数
在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,或者用ECMAScript 的概念来说,就是 arguments 对象中的一个元素)。
|
1
2
3
4
5
6
7
8
|
function addTen(num){ num +=10; return num;}var count = 20;var result = addTen(count);alert(count); //20alert(result); //30 |
在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。传给函数的是数值的一个引用,函数中对其属性的修改外部可见,但用新引用覆盖其则在外部不可见。
|
1
2
3
4
5
6
|
function setName(obj){ obj.name = "staven";}var person = new Object();setName(person);alert(person.name); //staven |
普通赋值
|
1
2
3
4
|
var a = 1;var b = a; //赋的是a的复制值b ++;alert(a); //"1" b的修改不影响a |
对象赋值
|
1
2
3
4
|
var a = [1];var b = a; //赋的是a的引用 b[0] ++;alert(a); //"2" b的修改对a也有效 |
参数传值传递:传给函数的是数值的一个复制,函数中对其的修改外部不可见
|
1
2
3
4
5
6
7
8
9
10
11
12
|
var a = 1;var b = 2;function change(a,b) { var c = 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
|
var a = [1, 2, 3];var b = [5, 6];function change(a,b) { a[0] = 4; //对其属性的修改外部可见 var c = 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
|
var a = [1, 2, 3];var b = [5, 6];function change() { var c = 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
|
var add_handlers = function (nodes) { var i; 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
|
var add_handlers = function (nodes) { var i; for (i = 0, l = nodes.length; i < l; i ++) { nodes[i].onclick = function (i) { return function(){ alert(i); } }(i); }}; |
这样修改后之所以正确是因为此时传进去的是i的值的复制。
检测类型
|
1
2
3
4
5
6
7
8
|
function setName(obj){ obj.name = "staven"; obj = new Object(); obj.name = "Bob";}var person = new Object();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中的变量分为基本类型和引用类型 基本类型是保存在栈内存中的简单数据段,它们的值都有固定的大小,保存在栈空间,通过按值访问 引用类型是保存在堆内存中的对象,值大小不固 ...
随机推荐
- Xcode7 项目转 Xcode6 时 出现问题
target specifies product type 'com.apple.product-type.bundle.ui-testing', but there's no such produc ...
- iOS开发UI篇—popoverController简单介绍(ipad)
一.简单介绍 1.什么是UIPopoverController 是iPad开发中常见的一种控制器(在iPhone上不允许使用) 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIVi ...
- mui slider 改变默认index
mui('class').slider().gotoItem(1,0) 目前已知问题,在class类名对应的dom元素是隐藏的时候初始化设置将报错,因为: 如果display取值是none,也就是不 ...
- 第四十二课:基于CSS的动画引擎
由于低版本浏览器不支持css3 animation,因此我们需要根据浏览器来选择不同的动画引擎.如果浏览器支持css3 animation,那么就使用此动画引擎,如果不支持,就使用javascript ...
- 世界上最小的发行版之一Tiny Core
Tiny Core Linux不足之处驱动不给力 Tiny Core是一个简单的范例来说明核心项目可以提供什么.它提供了一个12MB的FLTK/FLWM桌面.用户对提供的程序和外加的硬件有完整的控制权 ...
- Mysql 调优小技巧
MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思 ...
- Missing message for key "err1" in bundle "(default bundle)" for locale zh_CN
这个问题是: 你的使用了ApplicationResources_zh_CN.properties文件没有找到. 1.是struts-config.xml中的<message-resources ...
- keep_on _coding——js_good_parts
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Session的异常
既然这一天就这么废了,那就多说一些吧!其实session也是有潜在的问题的.Session销毁的三种情况: (1)超时:超过30分钟 (2)服务器非正常关闭,如果自己手动stop service而不是 ...
- jquery操作滚动条滚动到指定位置
<html><head><script type="text/javascript" src="/jquery/jquery.js" ...