2015-10-07 72 views
0

我想顯示一個項目列表,現在有時這些項目的標題只是一個純字符串,有時它可能是一個函數返回的值。Javascript Eval爲函數和純字符串工作

如何使用eval()使兩個事件都可以工作?

下面是一個例子代碼:

var a1 = "formatDate('" + startTime + "') + ' - ' + formatDate('" + endTime + "')" 
var a2 = "#america" 

var result1 = eval(a1) // works well! 
var result2 = eval(a2) // doesn't work, need to use eval('a2') but then first one doesn't work 

我能想到的唯一的事情就是創建如「#america」有它保存的,如「‘#america’」不是字符串的時候,但我寧願避免

[編輯]

最終我將有這樣的事情:

arr.push("formatDate('" + startTime + "') + ' - ' + formatDate('" + endTime + "')"); 
arr.push("#america"); 
for(var i = 0; i < arr.length; i++) { 
    var ev = eval(arr[i]); 
    console.log(ev); 
} 
+0

爲什麼'eval',可以直接調用該函數 – Tushar

+1

' 「#america''應該是'」 #america「'; – AdityaParab

+0

另一件事,如果你的'a2's會是一個字符串,爲什麼你需要'eval()'嗎? – AdityaParab

回答

1

我會建議將eval包裝在try catch塊中,如果eval成功,則返回值,否則返回最初傳遞給函數的值。有很多情況下,eval可能會失敗,因爲它只是試圖將字符串解析爲有效的JavaScript,所以任何無效的JS不僅僅是一個簡單的字符串可能會導致它失敗,所以最好是安全並捕獲來自它的任何錯誤。

var evaluate = function(value) { 
    try { 
     return eval(value); 
    } 
    catch(err) 
    { 
     return value; 
    } 
} 
+0

不解決他問的問題。在評論中發佈此內容。 – MortenMoulder

+0

它如何解決他所問的問題?他所做的所有評估代碼都會記錄到控制檯,在這種情況下,控制檯會很好地工作 –

+1

我必須在這裏與gabriel站在一起;這不太好,但它確實解決了手頭的問題。根據OP可以控制的情況,這可能是解決問題的唯一方法。 –

1

var ev = eval(a2)將相當於var ev = eval('#america')不作任何真正意義上的。

當你說eval('a2')工程,我認爲ev = '#america'是理想的結果。表達式被評估爲只需訪問該名稱的變量的值。

你基本上只是有一系列字符串,可能是有效的JavaScript代碼,或者可能不是,並且沒有辦法確定哪個是哪個。在這種情況下,你可以做的最好的就像

try { 
    ev = eval(arr[i]); 
} catch(ex) { 
    ev = arr[i]; 
} 

......這顯然看起來很糟糕。你能控制arr中條目的內容嗎?

arr.push(function() { 
    return formatDate(startTime) - formatDate(endTime); 
}); 
arr.push("#america"); 

在這種情況下,你可以檢查每個條目的類型,並採取相應的行動就可以了:

for(var i = 0; i < arr.length; i++) { 
    var ev = typeof arr[i] == 'function' ? arr[i]() : arr[i]; 
    console.log(ev); 
} 
0

這是我應該做的:

var a1 = function(){ 
      return formatDate(startTime) + formatDate(endTime) 
     } 
var a2 = "#america" 
var result1 = a1(); 
var result2 = a2; 

呦能檢查typeof(a1)var是一個函數還是一個對象或其他。

if(typeof(a1)=='function'){ 
    result = a1(); 
}else{ 
    result=a1; 
} 
相關問題