0

私は呼び出しオブジェクトを持っています:

var callingObj = { fun: myroot.core.function1,
                   opts: { one: "abc",
                           two: "car",
                           three: "this.myattr1" } };

後で、"fun" 属性の関数を呼び出す必要があります。この関数呼び出しのパラメーターは、属性 "opts" から取得する必要があります。関数の呼び出し時に、変数「three」が this.myattr1 の値を持つ必要があることは非常に重要です。

私はこのようなことができることを知っています:

// inside a for loop which is processing the opts attributes
if (attrValue.indexOf("this.") == 0) { 
  value = eval(attrValue);​​​​​​​​​​   
  paramsObj[attr] = value;
  // instead of eval I could use
  helpval = attrValue.substring(5);
  value = this[helpval];
  paramsObj[attr] = value;
}
else {
  paramsObj[attr] = attrValue;
}

しかし、「attrValue」で「this」を調べて検索し、それに反応する必要のない実装はありますか?

事前に助けてくれてありがとう。

更新: この場合、attrValue は「abc」、「car」、または「this.myattr1」です。paramsObj は、関数呼び出しのパラメーター オブジェクトです。

this.myattr1 を文字列に入れました。「これは後で」と言う他の可能性を知らなかったからです。

これと myroot.core.function1 は同じではありません!

4

2 に答える 2

1

このようなものがうまくいくかもしれません:

var callingObj = { 
    fun: myroot.core.function1,
    opts: [
        {value: "abc"},         // `value` for literals
        {value: "car"},
        {link: "myattr1"}       // `link` for local vars on `this`
    ]
};

使用中で:

// resolve args:
var opts = callingObj.opts,
    args = [],
    i = 0,
    max = opts.length;

for (; i < max; i++) {
    args.push(opts[i].link ? this[opts[i].link] : opts[i].value);
}

// apply with local scope
var result = callingObj.fun.apply(this, args);

これは、単一の引数ではなく、3 つの引数を期待する関数で機能しObjectます。

于 2012-12-18T11:00:28.583 に答える
1

jQuery のプロキシ関数のようなものを使用して、必要なことを行うことができます。あなたの説明は良いです-それはthis後で別のスコープです。

var callingObj = { 
    fun: myroot.core.function1,
    opts: { one: "abc",
            two: "car",},
    getVarCallback: $.proxy(this, 'getAttr1'),
};

そのため、パラメーターをそのまま渡すのではなく、関数が後で呼び出すproxyスコープが何であるかを知っている関数を作成します。this

関数 getAttr1 は、定義されているオブジェクトから myAttr1 の現在の値を返すだけです。

次に、関数を呼び出すには、次のようにします。

var currentValue = callingObject.getVarCallback();

callingObj.fun(
    callingObj.opts.one,
    callingObj.opts.two,
    currentValue
);

それはあなたが求めていることを行うための非常にきれいな方法です。次のように設定することで、自分で同等のことを行うこともできます。

var callingObj = { fun: myroot.core.function1, opts: { one: "abc", two: "car",}, caller: this, attrFunctionName: 'getAttr1'), };

そしてそれを呼び出す:

var attrFunction = callingObject.attrFunctionName;

var currentValue = callingObject.caller.attrFunction();

ただし、jQuery プロキシは、コールバックを処理する関数が、使用しているデータがオブジェクトから取得されたものであるか、単純な関数から取得されたものであるかを認識する必要がないため、非常にクリーンな方法です。はるかに保守可能です。

于 2012-12-18T11:10:35.597 に答える