对象 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 函数外、函数内会有不同的结果。这是为什么啊?半天想不出来,求大神指教,感觉是个作用域问题
