2014-01-05 48 views
0

我想构建一个模拟shell命令行为的函数:echo "var: $var"
代码的划痕可能是:用JavaScript模拟shell'echo'函数

// 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

这并不真正使多大意义?为什么你需要在一个并不真正支持它的语言中使用字符串中的变量,并且没有将变量传递给函数,那么就没有什么可以做的了,就像现在使用'this [entry]的方式一样。 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"