Две почти идентичные функции на одном уровне области видимости выполняют по-разному - PullRequest
0 голосов
/ 12 августа 2011

У меня странная проблема, я не могу разобраться:

У меня есть объект с 3 элементами (которые важны для этой проблемы):

base_url: 'http://resttest.******.com/v1/',
remind_url: function() { console.log(this.base_url); return this.base_url +'/member/passwordreminder/' },
login_url:  function() { console.log(this.base_url); return this.base_url + '/member/login' },

Они выглядят так внутри объекта:

app.controllers.login = new Ext.Controller({
/**
 * @cfg url
 * Login request URL
 */
base_url: 'http://resttest.******.com/v1/',
remind_url: function() { console.log(this.base_url); return this.base_url +'/member/passwordreminder/' },
login_url:  function() { console.log(this.base_url); return this.base_url + '/member/login' },

Когда я вызываю remind_url, base_url равен тому, что должно быть ('http://resttest.**.com/v1/'),, однако, когда я вызываю login_url, base_url не определен.

Почему?

Ответы [ 2 ]

1 голос
/ 12 августа 2011

Я предполагаю, что это проблема с this.Когда base_url не определено, это вероятно потому, что this является глобальным объектом, а не вашим объектом.Есть ли у вас что-то, что привязывает remind_url к this?Например, в Backbone.js представления обычно имеют строку, использующую Underscore.js, например:

_.bindAll(this, 'remind_url, 'login_url', etc);

, которая будет привязывать все методы, вызываемые в качестве обратных вызовов, к this.

Для подтверждения измените значение console.log(this.base_url) на console.log(this), чтобы узнать, что в данном случае означает this.

0 голосов
/ 13 августа 2011

Спасибо Renesis за правильный вопрос!

Я рассматривал вызов как метод, а не как функцию - this.login_url = undefined, но this.login_url () - нет.

...