1

関数の引数のプロパティを関数のローカル スコープに拡張することは可能ですか? 次のコードを使用します。

function foo(a, b) {
  // apply some magic here to extend arguments' properties into local scope
  assert(bar == 'hello')
  assert(baz == 'world')
  assert(qux == 1234)
}

foo({bar: 'hello', baz: 'world'}, {qux: 1234})

が呼び出される方法fooを制御できず、その実装のみを制御できると仮定すると、 as などのプレフィックスを不要にするためにできることはありますfooか?bara.bar

このような不自然な例では、これはおかしなことに思えるかもしれないので、全体的な目的を説明しましょう。インポートしたモジュールのメンバーの前にモジュール名を付ける必要がないように、requirejsを使用したいと考えています。例えば:

requirejs(['mod'], function(mod) {
  assert(mod.blah()) // OK, normal
  assert(blah())     // needs magic to work
})

これを達成しようとする理由は、論理的には 1 つのモジュールにまとめられるが、開発の便宜上の理由から、同じソース ファイル (たとえば、製品コードとテスト コード) でうまく混在しないと私が考えるいくつかのファイルがあるためです。

4

2 に答える 2

2

これを達成しようとする私の理由は、私の意見では論理的に単一のモジュールに属するいくつかのファイルがあるためです

ああ、私たちは XY 問題を抱えています :-) js にはこのような魔法のようなものはないので (すべてのモジュール プロパティをグローバル変数にすることを除いて - 確かにあなたが望むものではありません)、別の解決策が必要になります。

aメソッドを使用すると、 とbを 1 つのモジュールに簡単に混在させることができextendます。jQuery を使用すると、次のようになります。

var c = $.extend({}, a, b);

ただし、単純な for-in-loop でも同様に実行できます。a と b に依存し、c を返す独自の requirejs モジュールとして宣言することもできます。したがって、c を要求するだけで済みます。

開発の便宜上、同じソース ファイルにうまく混在させないでください。

いくつかの開発ファイルを 1 つの (巨大な) 運用ファイルに結合するビルド ツールを使用することによって、他の可能性があるかもしれません。それがあなたの場合に当てはまるかどうかはわかりません。

于 2013-02-11T18:21:34.523 に答える
0

しばらく経ちましたが、これを行う方法を発見しました。JavaScriptwithキーワードを使用して、オブジェクトをローカル スコープに拡張することができます。ただし、 MDN ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/withwith )によると、の使用はお勧めできません。しかし、どうしてもローカル スコープを拡張したい場合は、次のようになります。

function foo(a, b) {
  with (a) {
    with(b) {
      assert(bar == 'hello')
      assert(baz == 'world')
      assert(qux == 1234)
    }
  }
}

foo({bar: 'hello', baz: 'world'}, {qux: 1234})
于 2013-03-09T00:21:28.650 に答える