Переполнение стека в рекурсии IE -> window.frames не равно самому себе - PullRequest
2 голосов
/ 24 декабря 2011

Я делаю рекурсию по всему дереву объектов javascript, доступных из глобальной области окна.

В Chrome, Firefox и Safari все отлично, но у меня возникла небольшая проблема в Internet Explorer.

По сути, я строю стек объектов при прохождении по дереву, поэтому я могу проверить, что линия объекта была назначена более чем в одном месте. Например я проверяю.

var ignoreStack = [window, document]; // grows over time to contain every object

ignoreStack.contains = function(obj) {
  for(var i=0;i<this.length;i++) {
    if (this[i] === obj) {return true;} 
  }
  return false;
};

// ... further down the line inside a recursion
if (!(obj instanceof Object)) {return;}
for (var prop in obj) { 
  if (ignoreStack.contains(obj[prop])) {return;}
  ignoreStack.push(obj[prop]);
  recurse(obj[prop], prop);
}

Теперь единственная проблема заключается в проверке следующего:

// Returns true in Chrome, Safari and Firefox
console.log(window.frames.frames === window.frames);
// Return false in IE

Каждый другой объект в дереве равен самому себе, однако window.frames в IE кажется единственным исключением, когда он не соответствует действительности, поэтому рекурсия продолжается следующим образом:

// window.frames.frames.frames.frames.frames ...etc

Кто-нибудь знает, почему window.frames не равен самому себе?

Я попытался покопаться в гугле и отладить с помощью инструментов IE Developer, все, что я могу собрать, это то, что это объект типа DispHTMLWindow2 (не то, что это много значит для меня) и что (в отличие от других браузеров) это не объект и не массив.

// Returns true in Chrome, Safari and Firefox
console.log(window.frames instanceof Object);
// Return false in IE

Если бы кто-то мог пролить свет на причину, по которой window.frames в IE ведет себя не так, как любой другой объект javascript (вызывая этот тип бесконечной рекурсии), это было бы очень полезно.

Заранее спасибо.

1 Ответ

4 голосов
/ 24 декабря 2011

Смежный вопрос о других хост-объектах, не равных в IEобъект (вызывающий этот тип бесконечной рекурсии), который был бы очень признателен.

window.frames является хост-объектом.Хост-объектам разрешено делать все что угодно в ES3.IE печально известен тем, что имеет очень плохо себя ведущие объекты.Вы мало что можете с этим поделать.

Я рекомендую вам сделать грязный хак, который представляет собой жестко запрограммированную проверку того, является ли ключ 'frames' и obj window и игнорирует все это.1014 *

В window.frames есть еще куча свойств, которые также не ведут себя.

...