var foo = {
p1: function(){
return this.p2;
},
p2: function(){
console.log('i am foo.p2');
}
};
我正在尝试做与上面示例类似的操作,但是当我调用时,我遇到了一个问题:
var result = foo.p1();
result =='undefined'
我对'this'在对象上下文中的工作方式感到困惑。有人可以解释我在哪里错了吗?
修改 更完整的例子:
suite_segments.themis = {
//don't re-run themis initialization script
initialized: false,
/**
* Initializer for themis product. Returns true if initialization
* operations were performed, false if not (most likely because
* the product was already initialized -- not a fresh navigation)
*/
init: function(){
//prevent multiple initializations
if(this.initialized)
return false; //did not initialize
this.initialized = true;
//operations
jQuery('#tabs').tabs();
//init success
return this.themis_destroy;
},
/* ----------------------------------------------------------------------------------
* DESTRUCTORS
* ----------------------------------------------------------------------------------/
/**
* Function to be invoked if user navigates away from 'themis' entirely. Other
* sub-destroy type functions will be invoked if necessary when a user switches
* between parts of themis
*
*/
themis_destroy: function(){
console.log('themis_destructor');
this.initialized = false;
},
/**
* Designed to be overwritten every time a segment of themis is loaded. Will be invoked
* ever time a segment of themis is loaded.
*/
themis_sub_destroy: function(){}
};
答案 0 :(得分:1)
Doug Crockford在对象中有一个很好的page about private/public/privileged members,并讨论了定义这些成员的最佳实践。这可能有助于消除围绕this
变量的一些混淆。
但是,在你的例子中,你不能向我们展示一些东西。 foo.p1
的返回值是函数foo.f2
,如下所示:
答案 1 :(得分:1)
您完成的示例也可以使用。使用您的代码,suite_segments.themis.init()
将返回descructor函数(或false
),而不是undefined
。
但是你有另一个问题:析构函数不起作用。阅读this excellent overview about the this
keyword,您会看到:this
指向当前上下文,这与调用有关。当按...themis.init()
调用时,函数将在themis
对象的上下文中调用 - 一切都很好。但是返回的函数(suite_segments.themis.destroy
)将不会在对象上调用,但(我猜)是独立的 - 并且没有机会设置正确对象的initialized
属性。
在你的情况下,我可以推荐.bind()
method来设置返回函数的上下文:
return this.themis_destroy.bind(this);
另请参阅this blog post about "objects with properties that are functions" or the mythof of methods,其中包含您的标题问题,以及this post about this
。
答案 2 :(得分:0)
你正在做一个矿工错误兄弟......
它应该是这样的:
var foo = {
p1: function(){
return this.p2();
},
p2: function(){
console.log('i am foo.p2');
}
};