Example of a circular reference in Javascript?

前端 未结 8 792
说谎
说谎 2020-11-27 16:36

I was wondering if anyone has a good, working example of a circular reference in javascript? I know this is incredibly easy to do with closures, but have had a hard time wr

相关标签:
8条回答
  • 2020-11-27 17:24
    window.onload = function() {
      hookup(document.getElementById('menu'));
    
      function hookup(elem) {
        elem.attachEvent( "onmouseover", mouse);
    
        function mouse() {
        }
      }
    }

    As you can see, the handler is nested within the attacher, which means it is closed over the scope of the caller.

    0 讨论(0)
  • 2020-11-27 17:26

    Or even simpler, an array "containing" itself. See example:

    var arr = [];
    arr[0] = arr;
    
    0 讨论(0)
  • 2020-11-27 17:29

    You can do:

    • window.window...window
    • var circle = {}; circle.circle = circle;
    • var circle = []; circle[0] = circle; or circle.push(circle)
    • function Circle(){this.self = this}; var circle = new Circle()
    0 讨论(0)
  • 2020-11-27 17:34

    Probably the shortest way to define a cyclic object.

    a = {}; a.a = a;
    
    0 讨论(0)
  • 2020-11-27 17:35
    var b = [];
    var a = [];
    a[0] = b;
    b[0] = a;
    

    Printing a or b would return Circular.

    0 讨论(0)
  • 2020-11-27 17:39

    A simple way to create a circular reference is to have an object that refers to itself in a property:

    function Foo() {
      this.abc = "Hello";
      this.circular = this;
    }
    
    var foo = new Foo();
    alert(foo.circular.circular.circular.circular.circular.abc);
    

    Here the foo object contains a reference to itself.

    With closures this is usually more implicit, by just having the circular reference in scope, not as an explicit property of some object:

    var circular;
    
    circular = function(arg) {
      if (arg) {
        alert(arg);
      }
      else {
        // refers to the |circular| variable, and by that to itself.
        circular("No argument");
      }
    }
    
    circular("hello");
    circular();
    

    Here the function saved in circular refers to the circular variable, and thereby to itself. It implicitly holds a reference to itself, creating a circular reference. Even if circular now goes out of scope, it is still referenced from the functions scope. Simple garbage collectors won't recognize this loop and won't collect the function.

    0 讨论(0)
提交回复
热议问题