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