对象 a 、 b 存在循环引用,现在要编写一个 copy 函数,能够正常拷贝 a
var a = {}
var b = {}
a['b'] = b
b['a'] = a
console.log(copy(a))
以下代码能够正常运行
var store = [] // store 写在 copy 函数外
function copy(data) {
var isType = function(v, type) {
return Object.prototype.toString.call(v).toLowerCase() === '[object ' + type + ']'
}
var checkInStore = function(checkV) {
for (var i = 0, len = store.length; i < len; i++) {
if (store[i] === checkV) {
return true
}
}
return false
}
var _copy = function(_data) {
if (checkInStore(_data)) {
return _data
} else {
store.push(_data)
var ret = isType(_data, 'array') ? [] : {}
for (var k in _data) {
var v = _data[k]
if (typeof v === 'object') {
ret[k] = copy(v)
} else {
ret[k] = v
}
}
return ret
}
}
return _copy(data)
}
以下代码会抛错
function copy(data) {
var isType = function(v, type) {
return Object.prototype.toString.call(v).toLowerCase() === '[object ' + type + ']'
}
var store = [] // store 写在函数里
var checkInStore = function(checkV) {
for (var i = 0, len = store.length; i < len; i++) {
if (store[i] === checkV) {
return true
}
}
return false
}
var _copy = function(_data) {
if (checkInStore(_data)) {
return _data
} else {
store.push(_data)
var ret = isType(_data, 'array') ? [] : {}
for (var k in _data) {
var v = _data[k]
if (typeof v === 'object') {
ret[k] = copy(v)
} else {
ret[k] = v
}
}
return ret
}
}
return _copy(data)
}
将 store 写在 copy 函数外、函数内会有不同的结果。这是为什么啊?半天想不出来,求大神指教,感觉是个作用域问题
1
xss 2017-02-21 14:43:25 +08:00
store 在外面, 位于全局作用域, 无论递归调用多少次 copy, 最终都会顺着原型链找到全局域上的 store.
store 写在里面, 在递归调用 copy 的时候, 每个调用栈内部都有一个单独的 store 状态, 所以, 你确定每次的 store 的状态都是正确的? |
2
fyh1807008 2017-02-21 14:44:09 +08:00
递归循环调用?
第二个函数每次 store 都被初始化为[],就没有临界值结束循环了 |
3
fyh1807008 2017-02-21 15:17:26 +08:00
其实第二段代码只要把 `ret[k] = copy(v)` 改成 `ret[k] = _copy(v)` 就会形成一个闭包,始终保存住 store,isType, checkInStore
|
4
dnxbf321 OP |