0

mkdir -pたとえば、次のように、パス内の既存のオブジェクトを上書きせずに、オブジェクトをカスタム名前空間に割り当てる関数があります。

assignObjectToNamespace(myObj, "com.stackoverflow.questions.root", window)

プロトタイプは次のようになります。

assignObjectToNamespace(object, namespace, target)

したがって、namespaceonを作成し、targetそれに を割り当てobjectます。明らかに、com.stackoverflowすでに存在するtarget場合は、上書き/初期化したくありません。

このメソッドは主にブラウザーのコンテキストで使用されるため、ターゲットとして渡す代わりに、オプションにしてルート要素をデフォルトにしwindowたいと考えています。target

私が持っている実装のどこかに:

if(!target) return
var recursiveElement = target

そして、名前空間に分離された要素がrecursiveElementなくなるまで、名前空間の 2 番目のオブジェクト、3 番目などに割り当てられます。.

コードを次のように変更したい場合

var recursive element = target || root

どうあるべきrootですか?

rootデフォルトにしない理由はwindow、このライブラリをもう少し一般的なものにして、ブラウザのコンテキストに結び付けないようにするためです。大したことではないことはわかっていますが、コードを変更して適応させるか、あきらめて3番目の引数を必須にするのではなく、知らない癖があるかどうかを知りたかったのです。

4

1 に答える 1

2

ブラウザー コンテキストにない場合、通常はルート コンテキストが呼び出されるglobalため、それを使用できます。

したがって、次のことができます。

var context = typeof window === 'undefined' ? global:window;

またはより一般的に - or を参照せずglobalwindow:

var customGlobalContext;
(function() { customGlobalContext = this; }).call(null);

後者は、コンテキストなしで実行されるメソッド (単純にf()or f.call(null)) がグローバル コンテキストで実行され、それthisを参照するため機能します。

アップデート

最初のアプローチは依然として優れていますが、2 番目のアプローチは で問題が発生する可能性がありますstrict mode

@Bergi のコメントの後、キーワードthisの内外を説明する興味深い記事を読みました。this

その後、globalコンテキストを取得するために、ファイルのルートに次の行を配置します(したがって、どの method/ にもラップされませんfunction):

var customGlobalContext = this;

この場合this、どこにいてもグローバル コンテキストを参照します (nodejs/window/etc.)。

于 2014-07-03T09:25:54.003 に答える