
对象 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 |