2014-01-05 81 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"