【JavaScript 】【Ruby】JavaScript とRubyのクロージャ
■topic summary
study about closure in JavaScript and Ruby
クロージャ内変数のスコープ
関数が宣言された時点までではなく、returnで関数が返される範囲まで
var p = function(obj){console.log(obj)}; function f(arg){ var n = 123 + Number(arg); function g(){p(n)} n++; return g n=19; } f(10)();
■実行結果
134
Rubyで、同じスコープ内のlambdaを定義すると、変数の値を更新できること
は、前見たところだけど、
JavaScript も同じ考え方。
クロージャの特徴として
引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とする。
http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3
があるわけだから、言語によらない点なのかなと思う。
同じスコープ内で関数定義
■Ruby
def method1(n) execer = lambda{p n} setter = lambda{|data| n = data} return execer, setter end a=2 execer, setter = method1(a) execer.call setter.call("jjj") execer.call
function method1(n){ function execer(){p(n)} function setter(data){n = data} return [execer, setter]; } var a=2; var closure = method1(a); execer = closure[0]; setter = closure[1]; execer(); setter("jjj"); execer();
■実行結果
2 "jjj"
うんうん。