ruby on railsのalias_method_chain的な動きをさせたくて
function foo() { console.debug("foo"); } var fooWithoutBar = foo; foo = function() { console.debug("before foo"); fooWithoutBar(); console.debug("after foo"); } foo();
と書きましたが、これは問題なく動きます。ところが
(function() { function foo() { console.debug("foo"); } var fooWithoutBar = foo; foo = function() { console.debug("before foo"); fooWithoutBar(); console.debug("after foo"); } }()); foo(); // error
は動きません。関数内関数は、本当に関数内関数として動きます!rubyとは違いますな。。
8行目の代入がグローバルスコープ?とか考えてしまいましたが
・変数fooはローカルスコープで宣言されている(2行目)
・8行目で変数を探す際、ローカルスコープから探し始める
・ローカルスコープで発見!
・その変数に新しい関数オブジェクトを代入
という訳で、上記の即時関数の外ではfooは見えません。
ちなみに
var fooWithoutBar = foo; ↓ fooWithoutBar = foo;
とすると、即時関数外でもfooWithoutBar()は呼び出せます。代入時点ではfooWithoutBarという変数は存在しないのでグローバルスコープの変数となる為と思われます。
0 件のコメント:
コメントを投稿