对象 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 函数外、函数内会有不同的结果。这是为什么啊?半天想不出来,求大神指教,感觉是个作用域问题
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.