せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【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

 
JavaScript

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"

 
うんうん。