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

Doug Crockfordは、オブジェクト内のプライベート/パブリック/特権メンバーについての優れたページを持っており、それらのメンバーを定義するためのベストプラクティスについて説明しています。thisこれは、変数を取り巻く混乱を解消するのに役立つ可能性があります。

ただし、あなたの例では、何かを見せてはいけません。の戻り値foo.p1は、次のような関数foo.f2です。

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

于 2012-07-04T20:43:32.293 に答える
1

完成した例も同様に機能します。あなたのコードで、はではなく、descructor関数(または)suite_segments.themis.init() 返します。falseundefined

ただし、別の問題があります。デストラクタが機能しません。キーワードに関するこの優れた概要thisを読むと、次のことがわかりますthis。呼び出しに依存する現在のコンテキストを指します。ごとに呼び出さ...themis.init()れると、関数はthemisオブジェクトのコンテキストで呼び出されます-すべてが正常です。ただし、返される関数(suite_segments.themis.destroy)はオブジェクトで呼び出されませんが、(おそらく)スタンドアロンで呼び出されinitializedます。正しいオブジェクトのプロパティを設定する機会はありません。

あなたの場合、返された関数のコンテキストを設定する.bind()メソッドをお勧めします。

return this.themis_destroy.bind(this);

「関数であるプロパティを持つオブジェクト」またはメソッドの神話についてのこのブログ投稿も参照してください。これthisは、タイトルの質問を正確にカバーしています。

于 2012-07-04T22:15:18.887 に答える
0

あなたは鉱夫の間違いをしている...

次のようになります。

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

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