function copy(source, destination, stackSource, stackDest) {
if (isWindow(source) || isScope(source)) {
throw ngMinErr('cpws',
"Can't copy! Making copies of Window or Scope instances is not supported.");
}
if (!destination) {
destination = source;
if (source) {
if (isArray(source)) {
destination = copy(source, [], stackSource, stackDest);
} else if (isDate(source)) {
destination = new Date(source.getTime());
} else if (isRegExp(source)) {
destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]);
destination.lastIndex = source.lastIndex;
} else if (isObject(source)) {
destination = copy(source, {}, stackSource, stackDest);
}
}
} else {
if (source === destination) throw ngMinErr('cpi',
"Can't copy! Source and destination are identical.");
stackSource = stackSource || [];
stackDest = stackDest || [];
if (isObject(source)) {
var index = indexOf(stackSource, source);
if (index !== -1) return stackDest[index];
stackSource.push(source);
stackDest.push(destination);
}
var result;
if (isArray(source)) {
destination.length = 0;
for ( var i = 0; i < source.length; i++) {
result = copy(source[i], null, stackSource, stackDest);
if (isObject(source[i])) {
stackSource.push(source[i]);
stackDest.push(result);
}
destination.push(result);
}
} else {
var h = destination.$$hashKey;
if (isArray(destination)) {
destination.length = 0;
} else {
forEach(destination, function(value, key) {
delete destination[key];
});
}
for ( var key in source) {
result = copy(source[key], null, stackSource, stackDest);
if (isObject(source[key])) {
stackSource.push(source[key]);
stackDest.push(result);
}
destination[key] = result;
}
setHashKey(destination,h);
}
}
return destination;
}
其实这段代码的逻辑还是很清楚,只在
stackSource
和stackDest
加上递归,会稍稍让人晕乎。拷贝,尤其是深拷贝,需要特别注意递归引用(就是常说的循环引用)的问题,所以这两个 stack 就是缓存引用,用来处理递归引用的。递归,这个是编程的基本技能之一,如果不懂,就只好先去看看教科书了。isWindow
可以猜出来是判断是否window
对象的,isScope
不是很明白,看它的源码应该能懂,不过这里不 care,反正就是为了判断不能拷贝的对象。OK,注释写在下面的代码里了
一般这么长的代码都不会有人看, 真的. 不信你等等看.
一般这么长的代码都不会有人看, 真的. 不信你等等看.
一般这么长的代码都不会有人看, 真的. 不信你等等看.
一般这么长的代码都不会有人看, 真的. 不信你等等看.
一般这么长的代码都不会有人看, 真的. 不信你等等看.
一般这么长的代码都不会有人看, 真的. 不信你等等看.
一般这么长的代码都不会有人看, 真的. 不信你等等看.
一般这么长的代码都不会有人看, 真的. 不信你等等看.
就这么长一段代码..又不说是干啥用的..
不会有人帮你看的.....
...看着感觉是一个插件的源码的一 段