Блог Конфуция
String.interpolateJS() 22.11.2008

Помогает запихнуть в строку немного яваскрипта. Функция очень полезна во всяких ленгвиджпаках. Весь яваскрипт выполняется без ограничений, так что будьте бдительны.


"Welcome to ${company}!".interpolateJS({company:'Programica'})
//=> "Welcome to Programica!"

"Your name is ${name}.".interpolateJS({name:prompt('What is your name?')})
//=> "Your name is Dima."

// tru javascript inside :)
"Your name is ${prompt('What is your name?')}.".interpolateJS({})
//=> "Your name is Dima."

"${this.interpolateJS({})}".interpolateJS({})
// too much recursion

("${another = 'another', 'Just'} ${another}"+
    " ${'tpircSavaJ'.split('').reverse().join('')}"+
    " ${[\"hacker\"] || ''},").interpolateJS({another:1})
//=> "Just another JavaScript hacker,"

Компиляция нужна только при первой интерполяции строки, так как полученная после парсинга функция кешируется. Исходя из этого, первое обращение к interpolateJS() будет медленнее последующих.

Чтобы получить закешированную функцию по строке, обратитесь к объекту String.prototype.interpolateJS.cache:


var string = "${x} + 2 = ${ x + 2 } :)"
string.interpolateJS({x:2})
//=> "2 + 2 = 4 :)"

String.prototype.interpolateJS.cache[string]
//=> function ($_$h) { with ($_$h) { return x + $_$s[1] + (x + 2) + $_$s[2]; } }

Исходник в библиотеке.

Теги:
  • клиент
  • eval
  • interpolate
  • javascript
  • parsing
  • string
  • with
Очень жду ваших комментариев на почту или на гитхаб.