変数展開
ruby とかの #{foo} を 変数でおきかえてくれるやつね。
String.prototype.interpolate = function() { return this.replace(/#\{(.*?)\}/g, function($0, $1) { return window[$1]; }) }; var a = "hoge" alert("foo#{a}bar".interpolate()); // foohogebar
とりあえずグローバル限定。 ローカルのも考える。
ローカル変数も考慮に入れて
String.prototype.interpolate = function() { var variables = {} if(arguments.callee.caller) { var o = arguments.callee.caller.toString(); var regex = /var\s+([\w_]+)\s+=\s+"(.*?)"/g; o.replace(regex, function($0, $1, $2) { variables[$1] = $2; }) } return this.replace(/#\{(.*?)\}/g, function($0, $1) { return variables[$1] || window[$1]; }) }; function hoge() { var a = "hoge"; var b = "fuga"; alert("foo#{a}bar#{b}".interpolate()); //foohogebarfuga ローカル } var name = "higeorange" alert("Hello, #{name}!".interpolate() // Hello, higeorange! グローバル
Function.caller が使えないため Opera ではうごかず。
そもそも、 JavaScript クイックリファレンスによると
Function.caller は ECMAScript には含まれておらず、準拠した実装には必要ありません。 これは使うべきではありません。
とある。
ローカル変数の場合 function を文字列にして正規表現でごにょってるだけなのですべての変数に対応しているわけではない。