0

次のような変数があるとします。

var a = this.property || this.parent.anotherProperty;

コンテキストを設定することは可能です (コンテキストとは、「これ」を意味します。おそらく「スコープ」の方が適切な言葉です...)関数を使用する場合や関数aを使用する場合のように?.call().apply()

編集:

値を返すヘルパー関数があります。

  • 値が関数の場合 -> value()
  • 関数でない場合 -> 値

これはコードです:

function unwrapValue(value){
   return typeof value === 'function' ? value() : value; 
}

unwrapValue はプレーン オブジェクト (Utils) 内にあり、このオブジェクトの外部から呼び出されます。

Utils.unwrapValue(value);

今、私は関数にプロパティを持っていurlます(それは関数か何か他のものかもしれません):

this.url = this.baseUrl || this.collection.baseUrl;

this.url が関数なのか他のものなのかわからないので、unwrapValue を使用して url の値を取得します。

var params = {};
params.url = Utils.unwrapValue(this.url);

そして問題はここにあります.unwrapValueはthis.urlを返しますが、「this」を別のものに設定します(私はそれがUtilsオブジェクトだと思っていましたが、何らかの理由でwindowオブジェクトです)ので、これは私が望むものではありませんparams.url.window.baseUrl || window.collection.baseUrl

valueこの方法で解決した関数の場合:

function unwrapValue(value, context){
    if(typeof value === 'function'){
        return typeof context === 'undefined' ? value() : value.call(context);
    }else{
        return value;
    }
}

に 2 番目のパラメータcontextが渡されるとunwrapValue、値thisが に設定されcontextます。

この質問では、次のような関数ではなかったcontext場合に同様に使用する方法を探していました。value

this.url = this.baseUrl || this.collection.url;

もう少し明確にするために: this.baseUrl と this.collection.url は単純な文字列です。

それを解決する方法はありますか?

4

2 に答える 2

1

オブジェクト リテラルをthisArgとしてその関数に渡したい場合があります。

function fn() {
    var a = this.a || this.parent.a;
    console.log(a);
}
fn.call({
    a: false,
    parent: {
        a: "foobar"
    }
});

それ以上の引数を渡さないので、apply代わりに. を使用することもできますcall

于 2012-12-19T21:21:55.810 に答える
1

それが関数であると仮定するとa(質問からは不明です)、それFunction.bindに対して行われたすべての呼び出しのコンテキストを設定するために使用できます:

var a = (this.a || this.parent.a).bind(this);

詳細についてはMDNを参照し、古いブラウザーの場合は shim を参照してください。

于 2012-12-19T21:09:32.293 に答える