属性为函数的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);