2016-10-11 70 views
1

說我有模板的文字,像這樣:評估模板文字動態

const val = `string text ${expression} string text` 

我要動態地評估模板字面成成品字符串。

function toFoo(templateLiteral){ 
    //returns "string text Foo string text" 
    return templateLiteral.evaluate('Foo'); 
} 

function toBar(templateLiteral){ 
    //returns "string text Bar string text" 
    return templateLiteral.evaluate('Bar'); 
} 

function toBaz(templateLiteral){ 
    //returns "string text Baz string text" 
    return templateLiteral.evaluate('Baz'); 
} 

有沒有辦法像這樣用模板文字,或者我只是愚蠢? (template.evaluate()是一個組成函數,但我正在尋找與JS的那種功能!)。

+0

排序的聲音就像一般的替換功能沒有? – peteb

+0

但是......模板文字(如所有文字)不會在它出現的位置被評估,創建一個不知道它來自文字的字符串? – nnnnnn

+0

可能不是如果它包裹在一個函數中:) –

回答

0

我認爲做這件事的最好方法很明顯,只是扭轉問題給出的情況。 您只需將函數中的模板文字包裝起來,然後您將延遲評估,直到您傳入所需的參數。就這麼簡單。

function evaluteTemplateLiteral(bar){ 
    return `foo ${bar} baz`; 
} 

現在如果你想更大膽的嘗試,你可以創建這樣的:

function evaluateGeneric(vals, fn){ 
    return fn.apply(null, vals); 
} 

,你會用上面像這樣:

evaluateGeneric(['brown','fox','cholo'], function(){ 
    return `the quick ${arguments[0]} fox ${arguments[1]}`; 
}); 
0

標籤模板字符串可以幫助在這種情況下:

function toFoo(strings, ...values) { 
    console.log(strings[0]); // string text 
    console.log(strings[1]); // string text 
    console.log(values[0]); // <your-passed-expression> 

    // TODO: Do your manipulation 
} 

const val = toFoo`string text ${expression} string text`; 

strings包含該行的「正常」標記和values是「變量」部分。請注意,您必須手動連接字符串。

+0

在你的例子中'strings'將是'[「string text」,「string text」]',不是嗎? – nnnnnn

+0

哦,是的,你說得對。會改變它。 – notion