先来热身:
// 代码片段1
var n = 10
function addTen(n) {
n += 10
}
addTen(n)
//此时n是20吗?
// 代码片段2
var obj = {}
function addName(obj) {
obj.name = 'obj'
}
addNunber(obj)
//此时obj.name == 'obj'吗?
// 代码片段3
var obj = {}
function setNull(obj) {
obj = null
}
setNull(obj)
//此时obj == null吗?
揭晓谜底:
代码片段1 n 仍然是10
代码片段2 obj.name == 'obj'
代码片段3 n != null
原理分析
- 代码片段1
// 代码片段1
var n = 10
function addTen(n) {
n += 10
}
addTen(n)
外部的n的值被复制给addTen函数的一个局部变量n,两个n只是值相等,但是没有任何引用关系,所以当内部的n发生变化时,外部的n不会跟着发生变化
- 代码片段2
// 代码片段2
var obj = {}
function addName(obj) {
obj.name = 'obj'
}
addNunber(obj)
外部的obj被复制给addName的一个局部变量obj,内部的obj可以根据引用,访问外部的obj,当对obj进行操作或访问的时候,实际上操作的是外部obj
- 代码片段3
// 代码片段3
var obj = {}
function setNull(obj) {
obj = null
}
setNull(obj)
外部的obj被复制给addName的一个局部变量obj,因为内部obj只是外部obj的一个拷贝,所以将内部obj赋值为null的时候,只是改变了内部obj的引用,不会影响外部obj
网友评论