浮云间
因为对象是引用类型的,假设a = {name: "hello"};b = a; // 这个时候b和a引用的是同一个对象b.name = "hi"; // 此时b和a的name都是"hi"所以,如果要深拷贝对象,不能简单的只是把a赋值给b。同理,在这个例子中,假设a = {children: {name: "hello"}},a的children属性是一个对象,如果你直接使用obj[attr] = this[attr],那复制后的对象和a对象的children属性引用的是同一个对象,所以就需要对属性继续进行clone;报错的原因:首先,你代码没有抄全,下面还有一部分代码。当你没有抄全代码的时候,当attr等于"test"的时候,this[attr].clone()就会调用,在这次调用时,this是String对象"test","test"自有的属性是"0", "1", "2", "3",其实就是字符串的索引下标,因为我们可以通过[n]这种形式访问字符串的第(n+1)个字符。所以在for循环中会调用this[0].clone(), this[1].clone(), this[2].clone(), this[3].clone();调用this[0].clone()的时候,"test"的第一个字符是"t",所以this是"t"的字符串对象,t自有属性是"0",因为"t"的长度是1,所以会调用this[0].clone();调用this[0].clone()的时候,"t"的第一个字符是"t",所以this是"t"的字符串对象,t自有属性是"0",所以会调用this[0].clone();...所以会出现超过最大调用栈的情况。原文下面是有一个String的clone方法的:String.prototype.clone = function() { return this.valueOf(); };加上以后,就不会有这种情况了。