JavaScript eval替代方案

时间:2012-12-18 10:32:12

标签: javascript scope this

我有一个调用对象:

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不一样!

2 个答案:

答案 0 :(得分: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参数。

答案 1 :(得分:1)

您可以使用jQuery的proxy函数来执行您需要的操作。你的解释很好 - 它是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 = {         有趣:myroot.core.function1,         选择:{one:“abc”,                 二:“汽车”,},         来电者:这个,         attrFunctionName:'getAttr1'),     };

然后调用它:

var attrFunction = callingObject.attrFunctionName;

var currentValue = callingObject.caller.attrFunction();

然而,jQuery代理是一种非常干净的方式,因为处理回调的函数不必知道它使用的数据是来自对象还是来自普通函数,这使得代码更易于维护。