unknown: Neues JS-Objekt innerhalb eines Scopes?

Beitrag lesen

Du hast ein Objekt welches unter anderem einen Eventhandler als Property hat. Dass dieser Handler an einem Objekt liegt, ist also gewollt. Dann sollte man ihn auch mit diesem Objekt als Context aufrufen.
Du hattest jetzt

<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <a>===1===</a>
    <a>===2===</a>
    <script type="text/javascript">
      function XXX()
      {
        this.test = 0;
        this.handler = function()
        {
          alert(this.test++);
        }
      }
      function getHandler()
      {
        var xxx = new XXX();
        return xxx.handler;
      }
      var elems = document.getElementsByTagName("a");
      for (var i = 0; i < elems.length; i++)
      {
        elems.item(i).onclick = getHandler();
      }
    </script>
  </body>
</html>

und dort das Problem, dass der Handler mit dem falschen Objekt aufgerufen wurde. Damit ist "this.test" nicht vorhanden.
Umgangen hast du es indem du aus der Eigenschaft this.test eine lokale Variable var test gemacht hast. Der Handler wird aber immer noch mit dem falschen Context aufgerufen.
Willst du jetzt auf eine weitere Objekteigenschaft im Handler zugreifen, wird es immer noch nicht funktionieren

<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <a>===1===</a>
    <a>===2===</a>
    <script type="text/javascript">
      function XXX()
      {
        var test = 0;
        this.handler = function()
        {
          alert(this.setFlag())
        }
        this.setFlag = function()
        {
          return test++;
        }
      }
      function getHandler()
      {
        var xxx = new XXX();
        return xxx.handler;
      }
      var elems = document.getElementsByTagName("a");
      for (var i = 0; i < elems.length; i++)
      {
        elems.item(i).onclick = getHandler();
      }
    </script>
  </body>
</html>

Darum solltest du das eigentliche Problem beheben und den Handler mit dem entsprechenden Context aufrufen.

<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <a>===1===</a>
    <a>===2===</a>
    <script type="text/javascript">
      function XXX()
      {
        var test = 0;
        this.handler = function()
        {
          alert(this.setFlag())
        }
        this.setFlag = function()
        {
          return test++;
        }
      }
      function getHandler()
      {
        var xxx = new XXX();
        return function()
        {
          xxx.handler();
        }
      }
      var elems = document.getElementsByTagName("a");
      for (var i = 0; i < elems.length; i++)
      {
        elems.item(i).onclick = getHandler();
      }
    </script>
  </body>
</html>