問題タブ [scope-chain]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - スコープチェーンの長さを最小限に抑えるとパフォーマンスが向上しますか?
バックグラウンド
私はよくモジュール パターンを使用してコードを整理し、関数と定数が必要に応じて動作するようにします。CONSTANT
またはsomeFunc
が のみで使用される場合、 前者の 2 つがグローバル スコープを汚染しないように、 の定義を無名関数でanotherFunc
囲みます。anotherFunc
これにより、名前の競合を回避でき、コードを後で確認して、何が何に依存しているかを確認できます。
ただし、この戦略は多くのクロージャーを作成します。これらの依存関係を明示的に渡す方がパフォーマンスが向上するかどうか (および保守性も向上するかどうか) を考えています。これには、変数を見つけるために関数がたどらなければならないスコープ チェーンを最小限に抑える効果があると思います。
モジュール パターン自体に関するフィードバックを許可するために、3 つのバージョンを含めました。1) モジュール パターンなし、2) モジュール パターンあり、3) モジュール パターンあり、スコープ チェーンの最小化。
モジュールパターンなし
モジュール パターンあり、スコープ チェーンの最小化なし
モジュール パターンとスコープ チェーンの最小化を使用
概要
パフォーマンスが向上するバージョン (およびその理由) は? パフォーマンスの違いは重要ですか?(つまり、スコープ チェーンのルックアップは高価ですか?) メモリ使用量はどうですか? (つまり、変数を渡すことで、本質的にスコープを複製していますよね?)
javascript - 内部関数が返されたときにJavaScriptが外部関数の実行コンテキストを保持する方法は?
私はこれらの 2 つのブログを読んでいます: David Shariff によって発行された実行コンテキストとスコープ チェーンでは、JavaScript の実行コンテキストとスコープ チェーンの概念について詳しく説明しています。
上記のブログを読んだ後ではっきりしないことの 1 つは、javascript が親関数の実行コンテキストがガベージ コレクションされるのをどのように防止するかということです。
次の非常に単純なコードを見てみましょう。
外部関数が呼び出されると、内部関数へのポインターを取得します。したがって、この段階では、内部関数が作成/定義されていますが、まだ呼び出されていません。
ブログによると、関数が呼び出されている場合にのみ、スコープ チェーンが確立されます。したがって、内部関数が呼び出される前に、外部関数の実行コンテキストを参照するポインターはないと思います。では、js エンジンは外部関数の実行コンテキストがガベージ コレクションされるのをどのように防ぐのでしょうか?
javascript - Javascript オブジェクトのスコープ
このコードを実行すると
「こんにちは」と出力されます。しかし、なぜそれが起こっているのか理解できません。私が読んだことによると、スコープチェーンは定義中に互いに積み重ねられ、スコープの最後のブロックは実行時にそれらの上にアタッチされます。では、スコープ チェーンは、global -> function f -> ret Object -> function test のようであってはなりませんか? ret オブジェクトのメンバーがスコープ チェーンから除外されるのはなぜですか? オブジェクトのメンバーがスコープに関連付けられておらず、コンテキストの一部にすぎないようなものですか?