【问题标题】:Log : Uncaught RangeError: Maximum call stack size exceeded日志:未捕获 RangeError:超出最大调用堆栈大小
【发布时间】:2012-09-07 12:39:52
【问题描述】:

我有一个关于方法的严重问题。所以这是我的方法:

Object.prototype.clonage = function() {
  var newObj = (this instanceof Array) ? [] : {};
  for (i in this) {
    if (i == 'clone') continue;
    if (this[i] && typeof this[i] == "object") {
      newObj[i] = this[i].clonage();
    } else newObj[i] = this[i]
  } return newObj;
}

浏览器给了我:

未捕获的 RangeError:超出最大调用堆栈大小

在线:

for (i in this) {

有人有同样的问题吗?

【问题讨论】:

  • 您可能会无限次或非常频繁地调用.clonage
  • Frits 可能是对的。你能给我们一些关于你如何称呼它的背景吗?我刚刚在一次克隆调用中对其进行了测试,它运行良好。
  • 我这样使用它:window.tweetOrberByPassed = window.displayedTweetListing.clonage();他们都是对象。我在另一个脚本页面中有相同的功能,我对此没有任何问题。

标签: javascript jquery prototype


【解决方案1】:

如果这是任何类型的成就,我可以制作可以破坏您的克隆功能的 javascript 对象:)。

检查:http://jsfiddle.net/Bd6XL/2/

var x = { 
    a: 5, 
    b: "asdf" 
};
var y = { 
    a: 5, 
    b: "asdf" 
};

x.y = y;
y.x = x;

克隆其中任何一个。是的,由于循环引用,它不会工作。尝试调试您的对象,看看是否有任何循环引用。

还可以尝试将您的克隆限制在您真正需要的范围内。

编辑:

看看这个关于克隆的问题:What is the most efficient way to deep clone an object in JavaScript?

有很多答案。如果您使用 jQuery,请尝试接受的一种:

// Shallow copy
var newObject = jQuery.extend({}, oldObject);

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);

【讨论】:

  • 这有点奇怪。有没有其他方法可以克隆一个对象?我在想我的方法可以做到:s
  • 这是javascript。你可以用愚蠢的方式克隆,我会编辑我的答案。
  • 第二个救了我的命!再次感谢您! var newObject = jQuery.extend(true, {}, oldObject);
猜你喜欢
  • 2018-01-24
  • 2015-10-28
  • 2014-08-01
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多