1. ホーム
  2. javascript

[解決済み] var self = this; は悪いパターンか?

2023-08-12 17:47:57

質問

自分には必要だと思うのですが。

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" バインドを使用すると、メソッドのルックアップ チェーンの上限もロックされます。 (もはや上方多義性ではない!)というのは正しいのか正しくないのか。普通に不正解だと思います。

ハッピーコーディング。