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
节省更多的时间。
你有什么更好的主意/把戏吗?
这并不真正使多大意义?为什么你需要在一个并不真正支持它的语言中使用字符串中的变量,并且没有将变量传递给函数,那么就没有什么可以做的了,就像现在使用'this [entry]的方式一样。 substr(1)]',你在全局范围内,'this'是窗口,这就是为什么它只能在窗口附加变量的情况下工作。 – adeneo