在相同范围的两个几乎相同的功能执行不同

时间:2011-08-12 13:06:29

标签: javascript extjs sencha-touch

我有这个奇怪的问题,我无法理解:

我有一个包含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 个答案:

答案 0 :(得分:1)

我猜这是this的问题。当base_url未定义时,可能是因为this是全局对象,而不是您的对象。你有什么东西绑定remind_urlthis?例如,在Backbone.js中,视图通常使用Underscore.js这样的行:

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

将所有被调用的方法绑定到this的回调。

要确认这一点,请将console.log(this.base_url)更改为console.log(this),以了解此情况下的this

答案 1 :(得分:0)

感谢Renesis提出正确的问题!

我一直将调用视为一种方法,而不是函数 - this.login_url = undefined,但this.login_url()不是。