2012-12-18 56 views
0

我有一個調用對象:的JavaScript的eval替代

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

在以後的時間中,「好玩」屬性的函數被調用。這個函數調用的參數應該來自屬性「opts」。這是非常重要的,變量「三」應具有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」和反應?

感謝您提前提供任何幫助。

更新: attrValue在這種情況下是「abc」,「car」或「this.myattr1」。 paramsObj是函數調用的參數對象。

我已經把this.myattr1放在一個字符串中,因爲我不知道任何其他可能性來說「這個,但是在稍後的時間」。

這和myroot.core.function1是不一樣的!

+1

「attrValue」和「paramsObj」究竟是什麼? –

+0

'myroot.core'和'this'指向同一個對象嗎? – closure

+0

attrValue在這種情況下是「abc」,「car」或「this.myattr1」。 paramsObj是函數調用的參數對象。 –

回答

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

你可以使用像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 = { fun:myroot.core。function1, opts:{one:「abc」, two:「car」,}, 調用者:this, attrFunctionName:'getAttr1'), };

,然後把它稱爲:

var attrFunction = callingObject.attrFunctionName; 

var currentValue = callingObject.caller.attrFunction(); 

但是jQuery的代理是這樣做的一個非常乾淨的方式,因爲這是處理回調函數,並不一定知道,如果數據是使用來自一個對象或一個普通函數,這使得代碼更易於維護。

+0

你好Danack! $ .proxy是一個非常有趣的方法! –