[解決済み] var self = this; は悪いパターンか?
質問
自分には必要だと思うのですが。
var self = this;
は、私のjavascriptの'クラス'の中にたくさんあります。これは一般的に行われていますが、少し間違っていると感じています。 私がこの質問で見つけたいと思っているのは、これを扱うより良い方法、またはこれが非常に正しいと私を納得させる何かです。
これは、正しいバインディングを維持するための標準的な方法でしょうか?私は、明示的に 'this' を必要としない限り、どこでも 'self' を使用することを標準化すべきです。
編集 : 私はなぜこれが必要なのか正確に知っていますが、ただ、少し邪道だと思われているのか、そしてなぜなのかを考えています。私は、メソッドを呼び出すときに明示的にスコープを定義するための組み込みのJavaScript関数 'apply'もあることを認識しています。それはより良いものですか?
どのように解決するのですか?
他の方もおっしゃっているように この "余分な変数" は、(あるレベルでは)
this
は特殊な式であり、したがって、変数ではないため、実行コンテキスト/クロージャにバインドされていません。
しかし、私が思うに、あなたが尋ねていること(または私が本当に答えたいこと)は、次のとおりです。
<ブロッククオートと書くべきでしょうか。
var self = this
を付けるべきでしょうか?
概要
私は一度これを試してみて、同じ疑問を持っていましたが、もうこの方法は使いません。今は、クロージャでアクセスが必要なときのために、この構成を予約しています。私にとっては、これは私のコードに少しセマンティックを追加します。
this -> this
そして
self -> this (but really that) in a closure
質問アラカルト
<ブロッククオート <ブロッククオート...これは一般的に行われていることですが、少し間違っているように感じます。この質問で見つけたいのは、これを扱うより良い方法、またはこれが全く問題ないと私を納得させる何かです。
自分にとって正しいと思うことをしてください。ある方法を試してみて、後で元に戻すことを恐れないでください(ただし、各プロジェクトの中で一貫性を保つようにしてください:-)。
<ブロッククオート <ブロッククオートこれは、正しいバインディングを維持するための標準的な方法ですか?明示的に 'this' が必要な場合を除き、どこでも 'self' を使用することを標準化すべきでしょうか。
self"は最も一般的に使用される名前です。上記のように、私は逆のアプローチを好みます。
this
を使うことです。
...ちょっと邪道だと思われる場合とその理由。
悪は愚かな主観的な言葉です(時には楽しいけれども)。私はそれが悪であると言ったことはありません、ただ私がそのアプローチに従わない理由だけです。ある人々は、セミコロンを使わないことで私が邪悪であると言います。私は彼らに、実際に良い議論を思いつくか、JavaScript をもっと学ぶべきだと言います :-)
<ブロッククオートメソッドを呼び出すときに明示的にスコープを定義するために、javascriptの組み込み関数である「apply」があることは知っています。その方がいいのでしょうか?
の問題点は
apply/call
の問題は、関数を呼び出す時点でそれらを使用しなければならないことです。これは、もし誰かが
他の
としてあなたのメソッドを呼び出した場合、それは役に立ちません。
this
はすでにオフになっている可能性があります。これは、jQueryスタイルのコールバックで
this
がコールバックの要素/項目であるような場合に最も便利です。
余談ですが...
I
は避けたい。
を必要としないようにしたいので、一般にすべてのメンバ関数をプロパティに昇格させ、レシーバ (
this
) がただ "flow through" となるようなプロパティに、すべてのメンバー関数を昇格させます。
私のコードの "private" メソッドは "_" で始まり、ユーザーがそれらを呼び出す場合、それは彼らの責任です。これは、オブジェクトの作成にプロトタイプのアプローチを使用する場合にも、よりよく機能します (実際に、必要です)。しかし Douglas Crockford はこれに同意していません。 ルックアップ チェーンが予期しないレシーバーを注入することによって、あなたを妨害する場合があります。
コンストラクタで "self" バインドを使用すると、メソッドのルックアップ チェーンの上限もロックされます。 (もはや上方多義性ではない!)というのは正しいのか正しくないのか。普通に不正解だと思います。
ハッピーコーディング。
関連
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] セレクタの子を取得する方法は?
-
[解決済み] 配列の反復処理に "for...in "を使用するのは、なぜ良くないのでしょうか?
-
[解決済み] コールバック内で正しい `this` にアクセスする方法
-
[解決済み] varキーワードの目的と、どのような場合に使用する(または省略する)べきですか?
-
[解決済み] セルフクローズスクリプトエレメントが機能しないのはなぜですか?
-
[解決済み] オブジェクトリテラル/イニシャライザーの自己参照
-
[解決済み] JavaScriptの慣用句、var self = thisの根底にあるものは?
-
[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
-
[解決済み] Reactコンポーネントでthis.setStateを複数回使用するとどうなりますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaScriptでカスタムオブジェクトを「正しく」作成する方法とは?
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] モバイルWeb HTML5フレームワークの選び方【終了しました
-
[解決済み] URL/アドレスバーからJavascriptの関数を呼び出す
-
[解決済み] 兄弟ノードを選択する方法はありますか?
-
[解決済み] 文字列がhtmlであるかどうかをチェックする
-
[解決済み] moment.jsでミュータビリティを回避するには?
-
[解決済み] react-routerのハッシュフラグメントからクエリパラメータを取得する
-
[解決済み] jQueryで入力ファイルが空かどうかをチェックする方法
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる