Я хотел бы построить функцию, эмулирующую поведение команды оболочки: echo "var: $var"
.
Царапина кода может быть:Эмуляция функции «echo» оболочки с JavaScript
// Scratch of a shell like 'echo'
function echo(t){
var m= t.match(/\$[A-Za-z0-9]+/g);
m.unique().forEach(function(entry) {
var re=new RegExp ("\\" + entry, "g");
t=t.replace(re, this[entry.substr(1)]);
});
console.log(t);
}
Где unique()
работает на массиве так же, как следует из названия:
// Helper function: make array unique
Array.prototype.unique =function() {
return this.filter(function(elem, pos) {
return this.indexOf(elem) == pos;
}, this);
};
При работе с штрафом глобальных объектов все в:
//Global objects
var var1="value1";
s="var1 has $var1";
echo(s);
Дает:
"var1 has value1"
как и ожидалось. К сожалению, внутри функции:
//Global and local objects
function foo(){
var var2="value2";
s2="var2 has $var2";
echo(s);
echo(s2);
}
foo();
... только функциональные имена переменных могут быть захвачены:
"var1 has value1"
"var2 has undefined"
Учитывая, что var1
хранится в this
, тривиальное решение может хранить var2
там:
function foo(){
this.var2="value2";
s2="var2 has $var2";
echo(s);
echo(s2);
}
foo();
Отдает:
"var1 has value1"
"var2 has value2"
Помимо затрат на переписывание объявлений переменных, кажется очень плохой идеей хранить все как глобальное. Переходя к echo
, массив связанных переменных включал бы его в printf
(уже реализованный). Передача последовательности {var1: "value1", ...}
будет занимать больше времени, чем echo
.
Есть ли у вас какая-нибудь лучшая идея/трюк?
Это на самом деле не имеет смысла? Зачем вам нужно использовать переменные внутри строк на языке, который на самом деле не поддерживает его, и не передавая переменные функции, которую вы не можете сделать, так же, как вы делаете это сейчас с помощью этой [записи. substr (1)] ', вы находитесь в глобальной области действия, а' this' - это окно, и именно поэтому оно работает только с переменными, прикрепленными к окну. – adeneo