0
var foo = {
  p1: function(){
    return this.p2;
  },

  p2: function(){
    console.log('i am foo.p2');
  }
};

我正在尝试做与上面的示例类似的事情,但是当我调用时遇到了一个问题:

var result = foo.p1();

结果 == '未定义'

我对“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(){}


};
4

3 回答 3

1

您完成的示例也将起作用。使用您的代码,suite_segments.themis.init() 返回析构函数(或false),而不是undefined.

但是你还有另一个问题:析构函数不起作用。阅读这个关于this关键字的优秀概述,你会看到:this指向当前上下文,它是依赖于调用的。当 per 调用时...themis.init(),该函数将在themis对象的上下文中调用 - 一切都很好。但是返回的函数 ( suite_segments.themis.destroy) 不会在对象上调用,而是(我猜)是独立的 - 并且没有机会设置initialized正确对象的属性。

在您的情况下,我可以推荐设置返回函数上下文的.bind()方法:

return this.themis_destroy.bind(this);

另请参阅有关“具有作为函数的属性的对象”或方法的神话的博客文章,它完全涵盖了您的标题问题,以及有关this.

于 2012-07-04T22:15:18.887 回答
1

Doug Crockford 有一个关于对象内私有/公共/特权成员的好页面,并讨论了定义这些成员的最佳实践。this这可能有助于消除您对变量的一些困惑。

但是,在您的示例中,您不能向我们展示某些东西。的返回值是如下所示foo.p1的函数:foo.f2

http://jsfiddle.net/erSWu/1/

于 2012-07-04T20:43:32.293 回答
0

你犯了一个矿工的错误兄弟...

它应该是这样的:

var foo = {
  p1: function(){
    return this.p2();
  },

  p2: function(){
    console.log('i am foo.p2');
  }
};
于 2012-07-04T20:53:17.930 回答