标签:
在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,或者用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" |
|
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" |
|
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 |
标签:
原文地址:http://www.cnblogs.com/staven/p/3cb35f1b37b343934e47040224578512.html