2016-03-24 11 views
1

現在、pluralsightの "Advanced Javascript"を見ています。もちろん、「オブジェクト指向」の部分でカイルは私が完全に失われている部分があります:`var self = this`はコードの匂いと考えられますか?

NotesManager.prototype.showHelp = function() { 
    this.$help.show(); 

    document.addEventListener("click",function() __handler__(evt) { 
     evt.preventDefault(); 
     evt.stopPropagation(); 
     evt.stopImmediatePropagation(); 

     document.removeEventListener("click", __handler__,true); 
     this.hideHelp(); 
    },true); 
}; 

this参照は今this.hideHelp();が動作しないことになりますボタンになります。彼は修正にthis問題を言いますが、それは結合していないことができるので、他のproblem.Aboveという名前の関数が使用されている原因

NotesManager.prototype.showHelp = function() { 
    this.$help.show(); 

    document.addEventListener("click",function() __handler__(evt) { 
     evt.preventDefault(); 
     evt.stopPropagation(); 
     evt.stopImmediatePropagation(); 

     document.removeEventListener("click", __handler__,true); 
     this.hideHelp(); 
    }.bind(this),true); 
}; 

:彼は、最初の問題を解決するのは難しい結合溶液をしようとします。しかし彼は、機能の名前は現在結ばれているものではないと述べている。バインドされている関数は新しいハードバインド関数なので、ハードバインド関数への参照がないためアンバインドできません。ハァッ?誰でも説明できますか?彼は詳細には入っていない。彼は問題を解決する最良の方法は、自己参照を使用することで説明してその直後

NotesManager.prototype.showHelp = function() { 
    var self = this; 
    self.$help.show(); 

    document.addEventListener("click",function() __handler__(evt) { 
     evt.preventDefault(); 
     evt.stopPropagation(); 
     evt.stopImmediatePropagation(); 

     document.removeEventListener("click", __handler__,true); 
     self.hideHelp(); 
    },true); 
}; 

一般的に、彼はそれがコードのにおいを示したが、彼はこれが1であることを特徴とするので、これをやってないことをお勧めと言いますその稀な状況の中で最も良い解決策があります。彼は、あなたがthisの仕組みを実装するのが面倒になったので足で自分自身を撃ったと言うことになり、あなたはレキシカルスコープに戻りました。彼は、自己参照を使用する人々は一般的にどのようにメカニズムが機能するか理解していないと言いました。私は自己参照がコードのにおいであることは聞いたことがありません。私はそれが広く使われているのを見ました。なぜ一般的にコードのにおいを示しているのですか?おそらく、イベントハンドラがある場合にのみ使用するべきでしょうか?

+0

'.bind'は新しい関数を返します。' __handler_.bind(this)!== __handler__'を実行します。残りは、一人の意見です。 –

+1

彼は簡単に 'var __handler__ = function(evt){...} .bind(this);' – Bergi

答えて

1

Javascriptの一般的な範囲の問題です。新しい太い矢印の表記が役立つはずです。私の経験では、誰もがself = thisを使って嫌いですが、とにかくそれを行います。

脂肪矢印表記は、この問題を途方もなく助け、その導入がコードのにおいになってselfあるを使用してます。関数は 「オブジェクトと呼ばれる場合

矢印機能まで、すべての新しい機能は、厳密モード 関数呼び出しのコンテキストオブジェクトを未定義独自this値 (コンストラクタの場合に新しいオブジェクトを定義しましたメソッド "など)。これは、オブジェクト指向プログラミングの で迷惑であることが判明しました。

からMDN(。Code強調鉱山)

+0

あなたの主張をバックアップするソースがありますか、これはあなたの意見ですか? –

+0

特定のパラダイムで動作していない限り、コードの臭いは主観的なものです。私はほとんどこの意見を意見に基づいて締めくくったが、コードの匂いはSOの意見に基づくフラグの端を覆う重要なトピックだと私は思う。あなたが情熱的にそれを感じるなら、近くに投票してください。 – Quotidian

-1

編集:functionalスコープ にJavaScriptですべてがスコープの機能であるため、それはコードのにおいであると考えられる理由をlexical範囲を変更しました。しかし、thisは動的スコープです。

void foo() 
{ 
    int floo = 1; 

    void foo2() 
    { 
     console.log(floo); 
    } 
} 

すべての内部レベルが外部レベルにアクセスできます。

thisとは逆ですが、それはできません。

void foo() 
{ 
    //this refers to foo() 
    console.log(this) 

    void foo2() 
    { //this refers to foo2() 
     console.log(this); 
    } 
} 

でも、人々は混乱することがありますが、それは大きな問題ではありません。

+0

Okありがとうございます。 –

+0

1.あなたが書いたコードは有効なJavaScriptではありません。 2. JavaScriptには、語彙スコープではなく、_functionalスコープ_があります。 – Mathletics

関連する問題