eval しなくてもいい感じ
Function.call(this, "return "+ v )();
javascript の深淵に触れた気がする
var a = {name:"takuya",say:function(){console.log(this.name)}} //=>{ a: 'takuya', say: [Function] } var b = a.say.toString() //=>'function (){console.log(this.a)}' var c = Function.call(null,"return "+b)() c.call(a) //=>takuya
Javascript は、関数の実行時にthis のコンテキストを次々と変えることが出来る。なのでデータと処理を一対一に対応させる「クラス」という概念は少し違った設計思想になっているようだ
js における this は不安定さがあるけど、慣れると便利だ。
var a = {name:"takuya"} console.log_this = function(){ console.log(this) } console.log_this() //=>Console {...} // 関数をコピー a.log = console.log_this a.log() //=>{ name: 'takuya', log: [Function] } // 別オブジェクト b = {name:"taro"} a.log.call(b) //=>{ name: 'taro' }
関数は関数として単体で存在しているので、call を使えば、実行する主体を変えることが出来る。
これはこれで、便利なときと不便な時があるので好みの分かれる所。あまりコーディング規約で自由さを制限してしまうとJSで書く意味が薄れるのであまり制限してほしくないとも思う。