2015-12-09 3 views
0

Есть ли проблемы с производительностью или вещи, которые нужно утомлять, когда вещи ссылаются друг на друга таким образом, что к ним можно получить доступ бесконечно?Есть ли проблемы с ссылками на бесконечность в javascript (пример)

Вот пример ...

var Foo = function() { 
    var self = this; 

    this.setBar = function (bar) { 
     self.bar = bar; 
     self.bar.foo = self; 
    } 
}; 

var Bar = function() {}; 

var foo = new Foo(); 
var bar = new Bar(); 
foo.setBar(bar); 

// infinite references! 
console.log(foo.bar.foo.bar.foo); 

ответ

1

Некоторые вопросы, чтобы быть в курсе:

  1. Вы не можете назвать JSON.stringify() на объекте, который имеет циклические ссылки. Фактически, формат JSON сам по себе не дает никаких ограничений для указания круговой ссылки.
  2. Вы не можете вызвать функцию, которая внутренне полагается на JSON.stringify(), чтобы сериализовать данные и/или отправить сплющенный объект по проводу.
  3. Только очень умный код (который обнаруживает и делает правильную вещь с круговыми ссылками) может рекурсивно перебирать что-либо с помощью круглой ссылки. Довольно легко создать бесконечный цикл с относительно просто выглядящим рекурсивным итератором, если ваши данные имеют круговые ссылки в нем. Рекурсивный итерационный код также можно защитить от циклических ссылок, но проще сделать это прозрачно с объектом ES6 Set или Map, чем в ES5.

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

В самом браузере есть много примеров таких циркулярных ссылок. Например, весь DOM имеет это, поскольку родительский указывает на дочерние и дочерние указывает на родителя.

node.firstChild.parentNode.firstChild.parentNode.firstChild.parentNode === node 
1

Единственная проблема, с которой вы сталкиваетесь, заключается в том, что вы не можете превратить их в формат JSON, но это все.

Фактически, в браузере уже есть такое событие. global object имел свойство window, которое ссылается на глобальный объект.

Так ..

window.window.window.window.window === window 
Смежные вопросы