标签:
在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,或者用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); //20 alert(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