属性为函数的Javascript对象详细信息';这';
我试图做一些类似于上述示例的事情,但是我遇到了一个问题,当我调用时:属性为函数的Javascript对象详细信息';这';,javascript,object,scope,this,Javascript,Object,Scope,This,我试图做一些类似于上述示例的事情,但是我遇到了一个问题,当我调用时: var foo = { p1: function(){ return this.p2; }, p2: function(){ console.log('i am foo.p2'); } }; 结果==“未定义” 我对“this”在对象上下文中的工作方式感到困惑。有人能解释一下我哪里出了问题吗 编辑 更完整的示例: var result = foo.p1(); Doug Crockford有
var foo = {
p1: function(){
return this.p2;
},
p2: function(){
console.log('i am foo.p2');
}
};
结果==“未定义”
我对“this”在对象上下文中的工作方式感到困惑。有人能解释一下我哪里出了问题吗
编辑
更完整的示例:
var result = foo.p1();
Doug Crockford有一个很好的内部对象,并讨论了定义这些成员的最佳实践。这可能有助于消除您对这个
变量的一些困惑
然而,在你的例子中,你不能向我们展示一些东西。foo.p1
的返回值是函数foo.f2
,如下所示:
你犯了一个矿工的错误,兄弟 应该是这样的:
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(){}
};
您完成的示例也会起作用。在代码中,
suite\u segments.themis.init()
将返回描述符函数(或false
),而不是未定义的
但是你还有一个问题:析构函数不能工作。阅读后,您将看到:此
指向当前上下文,它依赖于调用。当根据…themis.init()
调用时,函数将在themis
对象的上下文中调用-一切正常。但是返回的函数(suite\u segments.themis.destroy
)不会在对象上调用,而是(我猜)独立调用,并且没有机会设置正确对象的initialized
属性
在您的情况下,我可以重新编译以设置返回函数的上下文:
var foo = {
p1: function(){
return this.p2();
},
p2: function(){
console.log('i am foo.p2');
}
};
另请参见,它完全涵盖了标题问题,并且。发布您正在尝试或制作的实际代码foo.p1()
真正产生foo.p2
。发布一个更完整的代码片段。我不知道,伙计,你的代码片段实际上可以在JSFIDLE中使用<代码>suite_segments.themis.init()
返回suite\u段。themis.themis\u destroy
。肯定还有别的东西。不,那会返回未定义的,因为foo.p2
不会返回任何东西。这不是Casey想要的。他希望返回对foo.p2
的引用,因为在他更详细的代码片段foo.p2
中,是一个将在以后调用的析构函数。虽然通过使用构造函数为对象提供私有“成员”可以解决OPs问题,但如果没有进一步的解释,那篇文章是完全无用的,特别是关于这个
关键字(文章没有澄清)
return this.themis_destroy.bind(this);