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 回答