7

名前空間はかつて ECMAScript (古い ECMAScript 4) の考慮事項でしたが、取り除かれました。ブレンダン・アイヒがこのメッセージで言っているように:

ES4 での名前空間の使用例の 1 つは、パフォーマンスとプログラマーの理解の両方のために早期バインディング (名前空間組み込みを使用) でした。ランタイムの名前バインディングが以前のバインディングと一致しない可能性はありません。ただし、Web のような動的コード読み込みシナリオでの早期バインディングには、早期バインディングと遅延バインディングの競合を回避するための優先順位付けまたは予約メカニズムが必要です。

さらに、一部の JS 実装者が懸念を持って指摘しているように、複数のオープンな
名前空間は、実装が
大幅に機能しない限り、ランタイム コストを課します。

これらの理由から、名前空間と早期バインディング (
この 4 月より前のパッケージなど) は廃止する必要があります。

しかし、そのすべてを理解しているかどうかはわかりません。優先順位付けまたは予約メカニズムとは正確には何ですか? また、それらのいずれかが必要になるのはなぜですか? また、事前バインディングと名前空間は連携する必要がありますか? どういうわけか、関連する問題に頭を悩ませることができません。誰かがより肉付けされた説明を試みることができますか?

また、名前空間がランタイム コストを課すのはなぜですか? 私の考えでは、名前空間とクロージャーを使用する関数の概念にほとんど違いが見られません。たとえば、Yahoo と Google はどちらも YAHOO と google のオブジェクトを持っており、これらのオブジェクトはすべてのパブリック変数とプライベート変数、関数、およびオブジェクトを 1 つのアクセス ポイント内に格納するという点で名前空間のように機能します。では、なぜ名前空間の実装がこれほど大きく異なるのでしょうか? 名前空間とは何かについて、私が誤解しているだけかもしれません。

賞金のために、私は2つのことを知りたいです:

  1. 名前空間には事前バインディングが必要ですか?
  2. 名前空間の実装は、プライベート メンバーを持つオブジェクトとどのように異なりますか?
4

2 に答える 2

2

関数の定義がその変数を呼び出した後にクロージャー内で変数を宣言すると、スコープ変数が引き続き使用されます。

function ShowMe() { 
    alert(myVar); //alerts "cool"
}

var myVar = "cool";

このプロセスは、名前空間に関してさらに複雑になります。

これ以外にも、expand/applyIf などと一緒に多数の名前空間メソッドがあり、同じ機能の多くを実行できます。たとえば、ExtJS の namespace() または jQuery の $.extend です。したがって、あると便利かもしれませんが、言語の構造内で絶対に必要というわけではありません。Array の拡張機能の一部を形式化することと、Date で ISO-8601 日付をサポートすることは、私自身よりもはるかに重要だと思います。定義のために各名前空間レイヤーを単純にチェックする必要があることを超えて...

window.localization = $.extend(window.localization || {}, {
  ...
});

window.localization.en = $.extend(window.localization.en || {}, {
  ...
});
于 2010-03-09T00:18:14.470 に答える
1

最初に OK 用語の一部:

  • アーリー バインディング -- コード行が解析されるときにチェック/検証します。
  • 遅延バインディング -- コード行が実行されたときにチェック/検証します。
  • 優先順位付け/予約 -- アーリー バインディングを実行し、コードが解析されるときに名前空間をチェックする場合、後で変数が動的に追加されたときに変数名を検証するプロセスと、何に対して異なるルール セットが必要になるかを意味していると思います。この時点で複数のスコープが関係している可能性があるため、有効です。

これらの非常に技術的な理由だけが与えられたことに、率直に言って驚いています。一般的なケースを考えてみましょう:-

onclick=' var mymark = "donethat";'

「mymark」はどの名前空間に属するべきですか? その質問に対する簡単な答えはないようです。特にコードスニペットを考えると:-

window.forms.myform.mybutton.onClick = ' var mymark = "donethat";'

変数を同じ名前空間に配置する必要があります。

于 2010-03-23T07:20:28.110 に答える