Born Neet

- The Emotional Programmer -

Shortcut Key
Next Page … J(Shift + j)Prev Page … K(Shift + k)
Scroll Down … Space / Page Down
Scroll Up … Shift + Space / Page Up
2007.11.14(Wed.) 19:49
 

このブログを始めてまだ1週間ちょっとしか経ってないのに、3日も空けてしまうとは…

別に何をやってたってわけでもないんですが、強いて言えば、JavaScriptの勉強してました。
で、記事のタイトル通りクロージャでつまづきまくってます。

クロージャとは…ってのは、googleやyahoo、参考記事に任せるとして、とりあえず、一人前のJavaScripterになるためには超えなきゃならない壁なわけです。

何でいきなり勉強しようと思ったかというと、この記事(JavaScript とクロージャ - bkブログ)が面白かったからです。
(別にclosureという響きが引きこもりっぽくて気に入ったわけではないですよ。)
入門書とかでサンプルを見たことはあったんですが、どう便利なのかイメージできなかったので…(応用力・想像力が足りない僕のせいですが)

せっかくなので勉強用に作ったスクリプトを張ってみます。
僕と同じく動いてるものを見ないとよくわからんって人もいると思うので。(まぁ僕もまだよくわかってないんですが…)

ちょっと長いので、続きに入れます。

興味ある人はどうぞ。


[ここから続き]

これがサンプルです。

カウントダウン1、2を適当にクリックしてみてください。

カウントダウン1 カウントダウン2


実はこの2つのリンクには、全く同じ関数を設定してあります。

ソース

<script type="text/javascript">
function bnCounter() {
 var count = 10;
 return function() { document.getElementById("bnConsole").value += count-- + " ";
  if(count < 0) count = 10;
 }
}
document.getElementById("bnLink1").onclick = bnCounter();
document.getElementById("bnLink2").onclick = bnCounter();
</script>

にもかかわらず、クリックすると、それぞれが独立してカウントダウンを行っています。
こういうことをグローバル変数を使わず実現できるのが、クロージャのすごさです。

とりあえず僕が理解できている(と思っている)のはここまでです。


以下は蛇足です。(Skip To 参考記事 

上の例だと厳密には関数名でグローバル変数を1つ使っちゃってますね…

ってことはこうすればいいのかな?

document.getElementById("bnLink1").onclick = (function() {
 var count = 10;
 return function() { document.getElementById("bnConsole").value += count-- + " ";
  if(count < 0) count = 10;
 }
})();
document.getElementById("bnLink2").onclick = (function() {
 var count = 10;
 return function() { document.getElementById("bnConsole").value += count-- + " ";
  if(count < 0) count = 10;
 }
})();
でもこれは、同じコード二回書いてるからよけい無駄な気がする。

こうか?

for(var i = 1; i < 3; i++) {
 document.getElementById("bnLink" + i).onclick = (function() {
  var count = 10;
  return function() { document.getElementById("bnConsole").value += count-- + " ";
   if(count < 0) count = 10;
  }
 })();
}
いや、これだとパフォーマンスに影響が出て本末転倒か。


話題が逸れて来たところで、今日は終わっておきます。

とりあえず、これからも頑張って勉強していきます…。


参考記事
(理解できたものだけではないです。僕が意味を取り違えている可能性は大いにあります。元記事に責任はありませんのであしからず。)

JavaScript とクロージャ - bkブログ
指向性メモ::2005-07-24::クロージャとOOPとJavaScriptの謎仕様
Effective JavaScript - Dynamic Scripting(http://www.interq.or.jp/student/exeal/dss/ejs/)
…サイトがなくなってたので、Internet Archiveを参照しました。
JavaScriptな日々 | クロージャとは?
JavaScriptの巧い書き方 - Archiva

他、多数。


以上です。

こんな長くてしょーもない記事を最後まで読んでくれてありがとうございました。
Post your Comment
Name (任意) :
Title (任意) :
URL (任意) :
Comment (日本語必須) :
Trackback

※ 日本語必須


この記事のトラックバックURL:
※ 超長文注意! 動的スクリプトローディング(さんざん既出だと思うけど - IT戦記が、さっぱりわかんなくて凹んだ。 でも、いろいろとJSのエッセンスが詰まってそうな気がしたので、頑張って読んでみた。 で、一応わかったつもりにはなれたので説明してみる。 (駄文だけど僕と同じレベルの人にはもしかしたら役に立つかもしれません) 非常に長いですが、よろしければどうぞ。 では、早速始めます。 [引用] まずは、全体を引用。 (コピーしにくいように一応行番号を入れてま...
Born Neet 2008/07/01(Tue) 19:27
  BackHOME : Next 
自作スクリプト実験
ブログ内検索
カレンダー
08 2008/09 10
S M T W T F S
1 2 3 4 5
8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
最近のコメント
[08/13 mymyeasy]
[07/31 mymyeasy]
[07/06 ゆーいち]
[07/05 ゆーいち]
[07/04 ゆーいち]
最近のトラックバック
RSS
RSS 0.91
RSS 1.0
RSS 2.0
プロフィール
HN:
t*
運営日数:
?日
記事数:
?件
ブログパーツ
あわせて読みたい
スポンサード リンク

Born Neet wrote all articles. 
Powered by Ninja.blog / TemplateDesign by TMP, modified by t*  

お買い得商品満載「楽市楽座」忍者ブログ