SlideShare a Scribd company logo
クロージャとか即時関数と 
か関数オブジェクトとか、 
JavaScriptのあれやこれや 
を⼀一つのサンプルで全部説 
明してみる 
株式会社FLECT 
⼩小⻄西俊司 
2014/10/09
この⽂文書の⽬目的 
u 某案件で⾒見見つけた、(多分ネット上からコピペしてき 
たと思われる)ほんの数⾏行行のコードが、読み解くのに 
u クロージャ 
u 即時関数 
u オブジェクトとしての関数 
u 変数の巻き上げ 
u などの理理解が必要になるというとても優れものの、い 
けてねーコードだったので隅々まで解説してみる
要件 
u 複数の画像ファイルを選択した時に、そのすべてのファイルのファ 
イル名とプレビューを表⽰示する 
u HTMLのみで⾏行行いサーバとの通信はなし 
u jQueryは使っても良良い
ヒント: FileReader 
u ローカルファイルの読み込みにはHTML5のFileReaderクラスが使⽤用 
出来る 
u readAsDataURLメソッドを実⾏行行すると、読み込み完了了時にonloadイ 
ベントが発⽣生 
u イベント内でe.target.resultでDataURLが取得できる
書いてしまいがちなコード 
u これは正しく動作する?
動作しない 
u 画像は正しく表⽰示されるがファイル名は 
すべて最後のファイル名になる 
u スコープの問題 
u クロージャと変数束縛 
u シングルスレッド実⾏行行
JavaScriptにブロックス 
コープはない 
u JavaScriptの変数宣⾔言はどこで⾏行行っても関数の先頭で⾏行行われたの 
と同じになる(変数の巻き上げ、と呼ばれている) 
ただし、可読性をあげ 
るためには、変数は使 
うところで宣⾔言した⽅方 
が良良い。 
この場合、⻑⾧長い関数で 
は後の⽅方で宣⾔言する変 
数名が既に使われてい 
るかもしれないという 
問題が発⽣生するが、そ 
もそも、⼀一⾒見見でつかめ 
ないような⻑⾧長い関数は 
書くべきではない
クロージャと変数束縛 
u クロージャでは外側のスコープの変数が使えるが、その際の値は 
実⾏行行時点での値になる 
u 下記関数では0..9が表⽰示される
シングルスレッド実⾏行行 
u reader#onloadが動くのはchangeイベントを抜けた後 
u この時file変数は最後のファイルを指している
ではどう書けば良良いのか?
即時関数を利利⽤用 
u FileReaderでググると⼤大概この書き⽅方が紹介されている
即時関数とは 
u 関数を定義してすぐに実⾏行行するJavaScriptの記法 
u 関数定義⾃自体を括弧で括って、それを実⾏行行するための引数の括 
弧を後ろに付ける 
u ⼀一番良良く⾒見見かける⽤用例例はscriptタグ内でスコープ 
を形成するケース 
u これによってグローバル変数を汚さないようにしている
jQueryプラグインでよく見 
る例 
u $はprototype.js等の別のライブラリでも使⽤用 
されているので必ずjQueryオブジェクトを指 
すようにする 
u undefinedは変数名として使⽤用できるので明 
⽰示的に宣⾔言して、引数を渡さないことによっ 
て確実にundefinedにしている
このケースのポイント 
u 即時関数によって新たなスコープが形成され、file変数が固定される 
u 内側の変数は外側の変数を隠す
関数を返す関数 
u JavaScriptでは普通に使われる 
u 多くの場合このケースのようにスコー 
プの形成と変数束縛のために使⽤用され 
る 
u 分岐でreturnする関数を切切り替える 
ケースもあるがその場合は、関数⾃自体 
は別に宣⾔言する⽅方が良良い 
u ぱっと⾒見見わかりにくいので、可能な限 
り使わない⽅方が良良い
もっと良良い書き⽅方 
u jQuery.eachでfile変数が束縛されているので即時関数を使 
⽤用する必要がない
まとめ 
u スコープを形成。他の⾔言語だとあまり聞 
かないけどJavaScriptでは超重要 
u この辺がちゃんとわかってないとjQuery 
とかAngularとかのソースを⾒見見てもまった 
く理理解できない 
u 配列列のループは原則forでまわさず 
jQuery.eachを使⽤用する 
u Array.forEachもあるが古いブラウザは対 
応していない 
u ネットからコードをコピる場合も思考停 
⽌止せずにちゃんと意味を理理解する

More Related Content

PDF
モダンJavaScript環境構築一歩目
PDF
JavaScript基礎勉強会
PDF
むずかしくないJavaScriptのやさしい話 jQueryからの次のステップ #ndsmeetup8
PDF
大規模なJavaScript開発の話
PDF
JavaScript MVC入門
PDF
覚醒!JavaScript
PDF
JavaScriptユーティリティライブラリの紹介
PDF
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
モダンJavaScript環境構築一歩目
JavaScript基礎勉強会
むずかしくないJavaScriptのやさしい話 jQueryからの次のステップ #ndsmeetup8
大規模なJavaScript開発の話
JavaScript MVC入門
覚醒!JavaScript
JavaScriptユーティリティライブラリの紹介
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」

What's hot (19)

PPT
第4回勉強会 Groovyの文法からSpockまで
PDF
キメるClojure
PDF
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
PDF
JVMの中身を可視化してみた
PDF
Java開発の強力な相棒として今すぐ使えるGroovy
PDF
プログラミング言語Clojureのニャンパスでの活用事例
PDF
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
PPTX
AngularJS2でつまづいたこと
PDF
Javaで1から10まで書いた話(sanitized)
PDF
JobStreamerではじめるJavaBatchのクラウド分散実行
PDF
Java初心者がJava8のラムダ式をやってみた
PDF
Jvm言語とJava、切っても切れないその関係
PDF
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
PDF
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
PDF
コンパイラ指向ReVIEW
PDF
Async DeepDive basics
PDF
JavaScript 研修
PDF
Sd Loader Seasar Con2009 White
PDF
Griffon10 in groovy_fx
第4回勉強会 Groovyの文法からSpockまで
キメるClojure
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
JVMの中身を可視化してみた
Java開発の強力な相棒として今すぐ使えるGroovy
プログラミング言語Clojureのニャンパスでの活用事例
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
AngularJS2でつまづいたこと
Javaで1から10まで書いた話(sanitized)
JobStreamerではじめるJavaBatchのクラウド分散実行
Java初心者がJava8のラムダ式をやってみた
Jvm言語とJava、切っても切れないその関係
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
コンパイラ指向ReVIEW
Async DeepDive basics
JavaScript 研修
Sd Loader Seasar Con2009 White
Griffon10 in groovy_fx
Ad

Similar to Javascriptのあれやこれやをまとめて説明してみる (20)

PPTX
Java script1
PDF
お手軽Ajaxアプリケーションの作り方
PDF
LT#7 Hello coffeeしてきた
PDF
Prototypeベース in JavaScript
PDF
ML system design_pattern
PDF
Web制作勉強会 #2
PPTX
Rawlerフレームワーク(全体)
PPT
Groovyコンファレンス
PPTX
Webスクレイピング用の言語っぽいものを作ったよ
PDF
SPA×Auth0
PPT
おとなのテキストマイニング
PDF
わかる LT@2
PDF
Lombok ハンズオン
PDF
ここからはじめるAction Script 3.0 入門前
PPTX
Reactつかってみた
PDF
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PPTX
Ll tiger clojure
PPTX
PHP基礎勉強会
PDF
今日からはじめるHTML5 ver.2012
PPTX
TypeScriptをオススメする理由
Java script1
お手軽Ajaxアプリケーションの作り方
LT#7 Hello coffeeしてきた
Prototypeベース in JavaScript
ML system design_pattern
Web制作勉強会 #2
Rawlerフレームワーク(全体)
Groovyコンファレンス
Webスクレイピング用の言語っぽいものを作ったよ
SPA×Auth0
おとなのテキストマイニング
わかる LT@2
Lombok ハンズオン
ここからはじめるAction Script 3.0 入門前
Reactつかってみた
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
Ll tiger clojure
PHP基礎勉強会
今日からはじめるHTML5 ver.2012
TypeScriptをオススメする理由
Ad

More from Shunji Konishi (20)

PDF
Salesforceのハッカソンに参加した話
PDF
Salesforce連携のためのOData入門
PDF
プロキシーを使ってテストを楽にする
PDF
MochaとChaiでやるJavaScriptテスト
PPTX
SendGridサンプルの紹介
PDF
セキュリティの考え方
PDF
一番簡単なWebSocketの試し方
PDF
WebSocketでリアルタイムクイズアプリを作ってみた
PDF
良質なコードを高速に書くコツ
PPTX
Heroku tips1
PDF
Playframework1でSeleniumテスト
PPTX
Heroku Dyno再起動時の振る舞い
PPTX
Dyno cycling behavior of Heroku
PPTX
Herokuで使えるRDBMS管理者ツール
PPTX
Play1 to Play2
PPTX
Herokuのログ解析ツール
PPTX
Excel2 canvas
PDF
特盛!Heroku
PPTX
文字コードのお話
PPTX
High traffic questionnaire site
Salesforceのハッカソンに参加した話
Salesforce連携のためのOData入門
プロキシーを使ってテストを楽にする
MochaとChaiでやるJavaScriptテスト
SendGridサンプルの紹介
セキュリティの考え方
一番簡単なWebSocketの試し方
WebSocketでリアルタイムクイズアプリを作ってみた
良質なコードを高速に書くコツ
Heroku tips1
Playframework1でSeleniumテスト
Heroku Dyno再起動時の振る舞い
Dyno cycling behavior of Heroku
Herokuで使えるRDBMS管理者ツール
Play1 to Play2
Herokuのログ解析ツール
Excel2 canvas
特盛!Heroku
文字コードのお話
High traffic questionnaire site

Javascriptのあれやこれやをまとめて説明してみる