2014-01-05 3 views
0

Я хотел бы построить функцию, эмулирующую поведение команды оболочки: 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.

Есть ли у вас какая-нибудь лучшая идея/трюк?

+1

Это на самом деле не имеет смысла? Зачем вам нужно использовать переменные внутри строк на языке, который на самом деле не поддерживает его, и не передавая переменные функции, которую вы не можете сделать, так же, как вы делаете это сейчас с помощью этой [записи. substr (1)] ', вы находитесь в глобальной области действия, а' this' - это окно, и именно поэтому оно работает только с переменными, прикрепленными к окну. – adeneo

ответ

1

Как сказал @adeneo, это не имеет большого смысла.

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

Затем вы можете использовать

function echo() { 
    console.log(Array.prototype.slice.call(arguments, 0).join('')); 
} 

И называют это как

var var1 = "value1"; 
echo("var1 has ", var1); // "var1 has value1" 

или непосредственно использовать

var var1 = "value1"; 
console.log("var1 has " + var1); // "var1 has value1" 
Смежные вопросы