JavaScriptのクロージャを説明
続いてクロージャについても説明。こう言えばよかったと今さらながらに思ったのでメモ。
- JavaScriptの関数はオブジェクトである
- 関数内で宣言された変数や関数の引数は,呼び出しごとに生成されるオブジェクト(変数オブジェクト)のプロパティとなる
- 関数内で参照される変数は,関数の内から外に向けて探索され,最初に見つかったものが使用される
- 関数オブジェクトが存続する限り,変数オブジェクト(とそのプロパティである変数)も存続する
- 関数[1]内から関数オブジェクト[2]をreturnすることで,不可視の変数オブジェクト(=関数[1]の)を携えたままの関数オブジェクト[2]を得ることができる → 関数[2]=クロージャ
…かえって解りづらいかも。
JavaScriptのthisのこと
会社でJavaScriptのthisキーワードについて説明する機会があった。
サンプルコード。結果表示はFirefoxのもの。
<html lang="ja"> <head><title></title></head> <body> <script> var C = function() { this.func = function() { document.write(this); document.write("<br />"); }; }; var c = new C(); c.func(); //=> [object Object] /* Cをコンストラクタとしてオブジェクトを生成し funcをcのメソッドとして呼び出すと, メソッド内のthisはcを指している。 */ var f = c.func; f(); //=> [object Window] /* オブジェクトcのメソッドをグローバルな関数として 取り出してから呼び出すと, thisはグローバルオブジェクトを指している。 */ var D = function() { this.toString = function() { return "I'm object!"; }; }; var d = new D(); f.call(d); //=> I'm object! /* 新たなオブジェクトdを生成し,それをcallメソッドの 引数として関数を呼び出すと,thisはdを指す。 toStringはオブジェクトを文字列化したい時に 呼び出されるメソッド。 */ </script> </body> </html>
Gitのインストール,設定メモ
前後したけど,Gitのインストールメモ
- Git - Downloadsから最新バージョンをダウンロード(記事作成時は[Git-1.7.11-preview20120620.exe])
- ダウンロードしたexeを実行
- インストール先を[C:\git]に変更(既定の[Program Files]だと,Emacsから使えなかった)
- [Select Components]では,[Advanced context menu]を選択,あとは適当
- [Adjusting your PATH environment]では,[Run Git from the Windows Command Prompt]を選択
- [Configuring the line ending conversions]では,[Checkout as-is,commit as-is]を選択
- インストール
- Git GUIを起動し,[編集]>[オプション]でユーザー名とメールアドレスを設定
svn->gitへのclone
gitを触ってみようと思い,試しにこれまで使っていたsvnのリポジトリをcloneしようとして躓いたのでメモ(Windows)。
git-svnのモジュール追加
git-bashで
$ git svn clone file:///D/repo
としても
Can't locate Git/SVN/Editor.pm in @INC ...
とのエラーが発生。Editor.pmなどのモジュールが入ってないらしい。ので,このあたりのファイルを「C:\Git\lib\perl5\site_perl\Git\SVN\」以下にコピー。
svnリポジトリの更新(参考:http://k-kamerad.no-ip.com/~nucleus/?itemid=514)
再度git svnするも,
Permission denied: Can't open '/tmp/report.tmp'
とのエラー。svnリポジトリが古い場合に起こるらしい。
Subversionを最新のものに更新した後,移行用のリポジトリをD:\repo2 に作成し,
> svnadmin dump D:\repo > repo.dump ... > svnadmin load D:\repo2 < repo.dump ...
でリポジトリの新バージョンを作成。
svnサーバを起動(参考:git svn clone でfile::///なリポジトリからのcloneに失敗したらsvn://を試してみよう - ..たれろぐ..)
$ git svn clone file:///D/repo2
を試みるも,
Couldn't open a repository: Unable to open an ra_local session to URL: Unable to open repository 'file:///D/repo2'
どうやら,fileスキームが使えないみたい。
そこで,一時的にsvnサーバを起動する。
> svnserve.exe -X --root E:\repo2
改めて
$ git svn clone svn://localhost/ repo.git ...
できた!\(^▽^)/
Word2003→2007への数式変換
小ネタ2
i = Man.new you = Woman.new i.love you
素敵なことです。
ManとWomanの実装↓
class Man def initialize @honesty = true end def love woman if @honesty puts 'I love you.' woman.love self end end end class Woman def initialize @honesty = true end def love man if @honesty puts 'I love you, too.' man.love self end end end
実行結果
I love you. I love you, too. I love you. I love you, too. ...(以下延々と)
...これも現実です。w
小ネタ
i = Man.new you = Woman.new i.love you
素敵なことです。
ManとWomanの実装↓
class Man def initialize @money = 1000 end def love woman @money -= woman.cost woman.love self end def available? @money > 0 end def miss woman # nothing to do end end class Woman def initialize @cost = 200 end def love man if man.available? puts 'I love you.' man.love self else puts 'bye!' man.miss self end end attr_reader :cost end
...現実なんて。orz