Как мне вызвать функции объекта внутри одного и того же объекта? - PullRequest
13 голосов
/ 18 апреля 2010

У меня есть следующий код Javascript

add_num = {
  f: function(html, num) {
    alert(this.page);
  },

  page : function() {
    return parseInt(this.gup('page'));
  },

  gup : function(name) {
    name = name.replace(/[\[]/,'\\\[').replace(/[\]]/,'\\\]');
    var regex = new RegExp('[\\?&]'+name+'=([^&#]*)');
    var results = regex.exec(window.location.href);
    if(results == null)
      return '';
    else
      return results[1];
  }
}

Но когда я вызываю add_num.f (), то, что я получаю от alert (), это фактический код страницы. То есть возвращается

function() {
    return parseInt(this.gup('page'));
  }

Я ожидал числовое значение, а не код вообще.

Ответы [ 3 ]

8 голосов
/ 18 апреля 2010

Это потому, что вам нужно вызвать функцию page:

alert(this.page());

вместо

alert(this.page);
5 голосов
/ 18 апреля 2010

Причина в том, что литерал не является функцией, поэтому не имеет (видимого) конструктора, поэтому «this» будет ссылаться на вызывающий объект.

Конечно, это не так, если вы используете назначение этого литерала прототипу функции, но я предполагаю, что это не тот случай.

Кроме того, Дарин прав, вы возвращаете функцию, а не выполняете ее.

Просто обращайтесь к объекту явным образом, например, add_num.page ().

add_num = {
  f: function(html, num) {
    alert(add_num.page());
  },

  page : function() {
    return parseInt(add_num.gup('page'));
  },

  gup : function(name) {
    name = name.replace(/[\[]/,'\\\[').replace(/[\]]/,'\\\]');
    var regex = new RegExp('[\\?&]'+name+'=([^&#]*)');
    var results = regex.exec(window.location.href);
    if(results == null)
      return '';
    else
      return results[1];
  }
}
4 голосов
/ 18 апреля 2010

Вы оповещаете саму функцию, а не результат ее выполнения. Вы должны сделать это:

alert(this.page());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...