SlideShare una empresa de Scribd logo
1 de 18
Descargar para leer sin conexión
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
2011年07月22日




                           株式会社ランチェスター
                           TEL: 03-5775-3395 Fax:03-5775-3396
                           URL: http://www.lanches.co.jp/
JavaScriptの変数とデータ型
        数値型(number)                              参照型(参照渡し)
        文字列型(string)
基本型
        真偽型(boolean)                             var a = {val:1};
        特殊(null、undefined)                       var b = a;
        オブジェクト(object)                           b.val = 5;
参照型     関数(function)                             alert(a.val); // 5
        配列(object)

基本型(値渡し)                                         var a = [1, 2, 3];
                                                 var b = a;
var a = 5;                                       b[0] = 5;
var b = a;                                       alert(a[0]); // 5
b = 10;
alert(a);     // 5                               ※ 関数の参照渡しは実例を見せる
                                                   のが難しいのでパス (´・ω・`)

                       Proprietary and Confidential to Lanchester Co.,LTD.   Page 1
JavaScriptの変数スコープ
• グローバルスコープ
   • プログラム中のどこからでも参照可能

• ローカルスコープ
   • その変数が宣言された関数の中でのみ参照可能

この2つしかないです。




              Proprietary and Confidential to Lanchester Co.,LTD.   Page 2
JavaScriptの変数スコープ - 実例1
var n = 1;           // グローバル

function f() {       // ←実はこれもグローバル
        var n = 0;   // ローカル
        return n;
}

alert(n);            // 1
alert(f());          // 0
alert(n);            // 1




                     Proprietary and Confidential to Lanchester Co.,LTD.   Page 3
JavaScriptの変数スコープ - 実例2
n = 1;              // グローバル

function f() {      // ←実はこれもグローバル
        n = 0;      // グローバル
        return n;
}

alert(n);           // 1
alert(f());         // 0
alert(n);           // 0

関数内で「var」を付けた変数がローカルスコープとなる。
グローバル変数の宣言は「var」を付けても付けなくても変わらない。


                    Proprietary and Confidential to Lanchester Co.,LTD.   Page 4
ローカルスコープは関数全体で有効
function f() {
        for(var i=0; i<10; i++) {
                // 特に何もしないよ
        }
        alert(i);      // ※
}

f();

※で「10」が表示される。

JavaScriptに「ブロックスコープ」は存在しない。



                    Proprietary and Confidential to Lanchester Co.,LTD.   Page 5
関数名も変数なので
function f() {
        g();                   // FunctionDeclarationにより
        function g() {         // 先に実行式があっても問題ない
                alert("localFunc");
        }
}

f();         // localFunc と表示
g();         // スコープ外なので実行不可

今までの考え方をそのまま活用でき、その通りの結果となる。




                   Proprietary and Confidential to Lanchester Co.,LTD.   Page 6
実は違った関数リテラルとFunction型
var n = 1;

function f() {
        var n = 0;
        var s1 = new Function("", "alert(n);");
        var s2 = function() { alert(n); };
        s1(); // 1→グローバルを参照
        s2(); // 0→ローカルを参照
}
f();

ECMAScriptの仕様により、Functionコンストラクタで作られる関数はグ
ローバルオブジェクトのスコープを参照して実行される。


                      Proprietary and Confidential to Lanchester Co.,LTD.   Page 7
実は違った関数リテラルとFunction型 - 2
// var n = 1;

function f() {
        var n = 0;
        var s = new Function("", "alert(n);");                              // エラー
}
f();

グローバル変数nがないためそもそも定義しようとした時点でエラーとな
ってしまう。




                      Proprietary and Confidential to Lanchester Co.,LTD.            Page 8
仮引数もローカルスコープ
var n = 1;

function f(n) {
        n++;
        return n;
}

alert(f(10));       // 11
alert(n);           // 1

同じ変数名だけど値渡しなのでグローバルのnはそのまんま。




                    Proprietary and Confidential to Lanchester Co.,LTD.   Page 9
仮引数もローカルスコープだけど・・・参照型
var a = [1, 2, 3];

function f(v) {
        v[0] = 10;
        return v;
}

alert(f(a));         // 10, 2, 3
alert(a);            // 10, 2, 3

違う変数名だけど参照渡しなので実体が変更される。




                     Proprietary and Confidential to Lanchester Co.,LTD.   Page 10
スコープチェイン
var a = 1;

function f() {
        var b = 2;
        function g() {
                var c = 3;
                return a + b + c;
        }
        return g();
}

alert(f());    // 6

自分自身のスコープにない変数の場合スコープを順に辿っていき、変
数を探し出す。
                       Proprietary and Confidential to Lanchester Co.,LTD.   Page 11
ところでthisって
<input type="button" value="test" id="btn">

<script type="text/javascript">
function where() {
          alert(this);
}

var o = { method: where };
document.getElementById("btn").onclick = where;

where();                     // [object Window]
o.method();                  // [object Object]
// [test]ボタンクリック             // [object HTMLInputElement]
</script>


「誰の関数として実行されたか」
がthisに入ってくる。
特にイベントハンドラの場合には注意。
                             Proprietary and Confidential to Lanchester Co.,LTD.   Page 12
本命:クロージャ(Closure、閉包)
• 引数以外の変数を実行時の環境ではなく、自身が定義された環境(
  静的スコープ)において解決することを特徴とする
   • Wikipediaより

• ローカル変数を参照している関数内関数
   • @ITより

• 関数自身が定義された環境を、ローカル変数も含めて持ち運ぶことの
  できる仕組み(またはそうした関数自体)
   • ZDNet builderより


・・・何言ってんだか分かんねっす(´・ω・`)


            Proprietary and Confidential to Lanchester Co.,LTD.   Page 13
シンプルなクロージャ
function closure(init) {
          var c = init;
          var f = function() {
                     c++;
                     return c;
          };
          return f;
}

var counter = closure(5);

alert(counter());   // 6
alert(counter());   // 7
alert(counter());   // 8


return fにより返された関数(counter)は、それが生成されたタイミング
でローカルスコープだったcを閉じ込めて(Closure/閉包)いる。


                             Proprietary and Confidential to Lanchester Co.,LTD.   Page 14
1つのクロージャを複数で使ってみる
function closure(init) {
          var c = init;
          return function(){ return ++c; }
}

var c1 = closure(5);
var c2 = closure(10);

alert(c1());       //   6
alert(c1());       //   7
alert(c2());       //   11
alert(c2());       //   12
alert(c1());       //   8
alert(c2());       //   13


それぞれがclosureを実行したタイミングでクロージャが作られている。



                             Proprietary and Confidential to Lanchester Co.,LTD.   Page 15
総決算
<input type="button" id="btn" value="設定">

<script type="text/javascript">
document.getElementById("btn").onclick = buttonState(true);

function buttonState(flag) {
        return function() {
                flag = !flag;
                this.value = flag ? "設定" : "解除";
        };
}
</script>



                     Proprietary and Confidential to Lanchester Co.,LTD.   Page 16
株式会社ランチェスター
TEL: 03-5775-3395 Fax:03-5775-3396
URL: http://www.lanches.co.jp/

Más contenido relacionado

La actualidad más candente

初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外higaki
 
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときShintarou Okada
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesShintarou Okada
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門kwatch
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】株式会社ランチェスター
 
C++ lecture-2
C++ lecture-2C++ lecture-2
C++ lecture-2sunaemon
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Keisuke Fukuda
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
Kotlin勉強会 in ehime
Kotlin勉強会 in ehimeKotlin勉強会 in ehime
Kotlin勉強会 in ehimeEigoro Yamamura
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublished20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublishedYoichiro Sakurai
 
そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4Shingo Inoue
 
これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6TanUkkii
 

La actualidad más candente (20)

pecl-AOPの紹介
pecl-AOPの紹介pecl-AOPの紹介
pecl-AOPの紹介
 
初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外
 
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるとき
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】
 
C++ lecture-2
C++ lecture-2C++ lecture-2
C++ lecture-2
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12
 
Jsonp
JsonpJsonp
Jsonp
 
Move semantics
Move semanticsMove semantics
Move semantics
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
Kotlin勉強会 in ehime
Kotlin勉強会 in ehimeKotlin勉強会 in ehime
Kotlin勉強会 in ehime
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublished20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublished
 
C++11
C++11C++11
C++11
 
そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4
 
これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
MlnagoyaRx
MlnagoyaRxMlnagoyaRx
MlnagoyaRx
 

Destacado

Slideshow good buy_online
Slideshow good buy_onlineSlideshow good buy_online
Slideshow good buy_onlinemomimu
 
Why Downturns Break Sales Orgs (And How to Fix Them) #IS12
Why Downturns Break Sales Orgs (And How to Fix Them) #IS12Why Downturns Break Sales Orgs (And How to Fix Them) #IS12
Why Downturns Break Sales Orgs (And How to Fix Them) #IS12InsideView
 
7 Key Ways To Drive Revenue Using LinkedIn
7 Key Ways To Drive Revenue Using LinkedIn7 Key Ways To Drive Revenue Using LinkedIn
7 Key Ways To Drive Revenue Using LinkedInInsideView
 
The TAS Group at InsideView #IS12
The TAS Group at InsideView #IS12The TAS Group at InsideView #IS12
The TAS Group at InsideView #IS12InsideView
 

Destacado (6)

Slideshow good buy_online
Slideshow good buy_onlineSlideshow good buy_online
Slideshow good buy_online
 
【書籍紹介】よくわかるJavaScriptの教科書
【書籍紹介】よくわかるJavaScriptの教科書【書籍紹介】よくわかるJavaScriptの教科書
【書籍紹介】よくわかるJavaScriptの教科書
 
【書籍紹介】ドメイン駆動設計
【書籍紹介】ドメイン駆動設計【書籍紹介】ドメイン駆動設計
【書籍紹介】ドメイン駆動設計
 
Why Downturns Break Sales Orgs (And How to Fix Them) #IS12
Why Downturns Break Sales Orgs (And How to Fix Them) #IS12Why Downturns Break Sales Orgs (And How to Fix Them) #IS12
Why Downturns Break Sales Orgs (And How to Fix Them) #IS12
 
7 Key Ways To Drive Revenue Using LinkedIn
7 Key Ways To Drive Revenue Using LinkedIn7 Key Ways To Drive Revenue Using LinkedIn
7 Key Ways To Drive Revenue Using LinkedIn
 
The TAS Group at InsideView #IS12
The TAS Group at InsideView #IS12The TAS Group at InsideView #IS12
The TAS Group at InsideView #IS12
 

Similar a ちょっと詳しくJavaScript 第4回【スコープとクロージャ】

Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Nextdynamis
 
Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話Nobuhiro Nakashima
 
JavaScript基礎勉強会
JavaScript基礎勉強会JavaScript基礎勉強会
JavaScript基礎勉強会大樹 小倉
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftTomohiro Kumagai
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会Koichi Sakata
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章YOSHIKAWA Ryota
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„和弘 井之上
 
var RAC3 = ReactiveCocoa + Swift
var RAC3 = ReactiveCocoa + Swiftvar RAC3 = ReactiveCocoa + Swift
var RAC3 = ReactiveCocoa + SwiftSyo Ikeda
 
RubyとJavaScriptに見る第一級関数
RubyとJavaScriptに見る第一級関数RubyとJavaScriptに見る第一級関数
RubyとJavaScriptに見る第一級関数Altech Takeno
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in DartGoro Fuji
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサーnakamura001
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発papamitra
 
Android OpenGL HandsOn
Android OpenGL HandsOnAndroid OpenGL HandsOn
Android OpenGL HandsOnIkuo Tansho
 

Similar a ちょっと詳しくJavaScript 第4回【スコープとクロージャ】 (20)

Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Next
 
Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話
 
JavaScript基礎勉強会
JavaScript基礎勉強会JavaScript基礎勉強会
JavaScript基礎勉強会
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
 
var RAC3 = ReactiveCocoa + Swift
var RAC3 = ReactiveCocoa + Swiftvar RAC3 = ReactiveCocoa + Swift
var RAC3 = ReactiveCocoa + Swift
 
RubyとJavaScriptに見る第一級関数
RubyとJavaScriptに見る第一級関数RubyとJavaScriptに見る第一級関数
RubyとJavaScriptに見る第一級関数
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in Dart
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
ちょっと詳しくJavaScript 第3回【prototype】
ちょっと詳しくJavaScript 第3回【prototype】ちょっと詳しくJavaScript 第3回【prototype】
ちょっと詳しくJavaScript 第3回【prototype】
 
20141129-dotNet2015
20141129-dotNet201520141129-dotNet2015
20141129-dotNet2015
 
OSC京都2011
OSC京都2011OSC京都2011
OSC京都2011
 
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発
 
Android OpenGL HandsOn
Android OpenGL HandsOnAndroid OpenGL HandsOn
Android OpenGL HandsOn
 

Más de 株式会社ランチェスター

【Web esSense】これぐらいは知っておきたい景表法の基礎知識
【Web esSense】これぐらいは知っておきたい景表法の基礎知識【Web esSense】これぐらいは知っておきたい景表法の基礎知識
【Web esSense】これぐらいは知っておきたい景表法の基礎知識株式会社ランチェスター
 
【web esSense】やりなおしのアクセス解析ツール学習~主にGoogle Analytics~
【web esSense】やりなおしのアクセス解析ツール学習~主にGoogle Analytics~【web esSense】やりなおしのアクセス解析ツール学習~主にGoogle Analytics~
【web esSense】やりなおしのアクセス解析ツール学習~主にGoogle Analytics~株式会社ランチェスター
 
【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)
【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)
【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)株式会社ランチェスター
 
【書籍紹介】こころを動かすマーケティング
【書籍紹介】こころを動かすマーケティング【書籍紹介】こころを動かすマーケティング
【書籍紹介】こころを動かすマーケティング株式会社ランチェスター
 
【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!
【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!
【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!株式会社ランチェスター
 
【書籍紹介】ノンプログラマのためのJavaScript
【書籍紹介】ノンプログラマのためのJavaScript【書籍紹介】ノンプログラマのためのJavaScript
【書籍紹介】ノンプログラマのためのJavaScript株式会社ランチェスター
 
ちょっと詳しくJavaScript 特別編【そして伝説へ…】
ちょっと詳しくJavaScript 特別編【そして伝説へ…】ちょっと詳しくJavaScript 特別編【そして伝説へ…】
ちょっと詳しくJavaScript 特別編【そして伝説へ…】株式会社ランチェスター
 
ちょっと詳しくJavaScript 第1回【連想配列と配列】
ちょっと詳しくJavaScript 第1回【連想配列と配列】ちょっと詳しくJavaScript 第1回【連想配列と配列】
ちょっと詳しくJavaScript 第1回【連想配列と配列】株式会社ランチェスター
 

Más de 株式会社ランチェスター (20)

【Web esSense】これぐらいは知っておきたい景表法の基礎知識
【Web esSense】これぐらいは知っておきたい景表法の基礎知識【Web esSense】これぐらいは知っておきたい景表法の基礎知識
【Web esSense】これぐらいは知っておきたい景表法の基礎知識
 
【書籍紹介】未来の働き方を考えよう
【書籍紹介】未来の働き方を考えよう【書籍紹介】未来の働き方を考えよう
【書籍紹介】未来の働き方を考えよう
 
【書籍紹介】型システム入門
【書籍紹介】型システム入門【書籍紹介】型システム入門
【書籍紹介】型システム入門
 
【web esSense】やりなおしのアクセス解析ツール学習~主にGoogle Analytics~
【web esSense】やりなおしのアクセス解析ツール学習~主にGoogle Analytics~【web esSense】やりなおしのアクセス解析ツール学習~主にGoogle Analytics~
【web esSense】やりなおしのアクセス解析ツール学習~主にGoogle Analytics~
 
【らぼ★ろぐ】jPlayerの紹介
【らぼ★ろぐ】jPlayerの紹介【らぼ★ろぐ】jPlayerの紹介
【らぼ★ろぐ】jPlayerの紹介
 
【書籍紹介】統計学が最強の学問である
【書籍紹介】統計学が最強の学問である【書籍紹介】統計学が最強の学問である
【書籍紹介】統計学が最強の学問である
 
【書籍紹介】伝え方が9割
【書籍紹介】伝え方が9割【書籍紹介】伝え方が9割
【書籍紹介】伝え方が9割
 
【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)
【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)
【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)
 
【書籍紹介】こころを動かすマーケティング
【書籍紹介】こころを動かすマーケティング【書籍紹介】こころを動かすマーケティング
【書籍紹介】こころを動かすマーケティング
 
【Web es sense】MultipeerConnectivityについて
【Web es sense】MultipeerConnectivityについて【Web es sense】MultipeerConnectivityについて
【Web es sense】MultipeerConnectivityについて
 
【書籍紹介】勝ち続ける意志力
【書籍紹介】勝ち続ける意志力【書籍紹介】勝ち続ける意志力
【書籍紹介】勝ち続ける意志力
 
【Web essense】KPIはじめました
【Web essense】KPIはじめました【Web essense】KPIはじめました
【Web essense】KPIはじめました
 
【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!
【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!
【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!
 
【書籍紹介】ノンプログラマのためのJavaScript
【書籍紹介】ノンプログラマのためのJavaScript【書籍紹介】ノンプログラマのためのJavaScript
【書籍紹介】ノンプログラマのためのJavaScript
 
【書籍紹介】ゆるす力
【書籍紹介】ゆるす力【書籍紹介】ゆるす力
【書籍紹介】ゆるす力
 
【Web esSense】KPIって何だ??
【Web esSense】KPIって何だ??【Web esSense】KPIって何だ??
【Web esSense】KPIって何だ??
 
Passbookとは_株式会社ランチェスター
Passbookとは_株式会社ランチェスターPassbookとは_株式会社ランチェスター
Passbookとは_株式会社ランチェスター
 
エンジニア的pinterest考察
エンジニア的pinterest考察エンジニア的pinterest考察
エンジニア的pinterest考察
 
ちょっと詳しくJavaScript 特別編【そして伝説へ…】
ちょっと詳しくJavaScript 特別編【そして伝説へ…】ちょっと詳しくJavaScript 特別編【そして伝説へ…】
ちょっと詳しくJavaScript 特別編【そして伝説へ…】
 
ちょっと詳しくJavaScript 第1回【連想配列と配列】
ちょっと詳しくJavaScript 第1回【連想配列と配列】ちょっと詳しくJavaScript 第1回【連想配列と配列】
ちょっと詳しくJavaScript 第1回【連想配列と配列】
 

Último

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 

Último (9)

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 

ちょっと詳しくJavaScript 第4回【スコープとクロージャ】

  • 1. ちょっと詳しくJavaScript 第4回【スコープとクロージャ】 2011年07月22日 株式会社ランチェスター TEL: 03-5775-3395 Fax:03-5775-3396 URL: http://www.lanches.co.jp/
  • 2. JavaScriptの変数とデータ型 数値型(number) 参照型(参照渡し) 文字列型(string) 基本型 真偽型(boolean) var a = {val:1}; 特殊(null、undefined) var b = a; オブジェクト(object) b.val = 5; 参照型 関数(function) alert(a.val); // 5 配列(object) 基本型(値渡し) var a = [1, 2, 3]; var b = a; var a = 5; b[0] = 5; var b = a; alert(a[0]); // 5 b = 10; alert(a); // 5 ※ 関数の参照渡しは実例を見せる のが難しいのでパス (´・ω・`) Proprietary and Confidential to Lanchester Co.,LTD. Page 1
  • 3. JavaScriptの変数スコープ • グローバルスコープ • プログラム中のどこからでも参照可能 • ローカルスコープ • その変数が宣言された関数の中でのみ参照可能 この2つしかないです。 Proprietary and Confidential to Lanchester Co.,LTD. Page 2
  • 4. JavaScriptの変数スコープ - 実例1 var n = 1; // グローバル function f() { // ←実はこれもグローバル var n = 0; // ローカル return n; } alert(n); // 1 alert(f()); // 0 alert(n); // 1 Proprietary and Confidential to Lanchester Co.,LTD. Page 3
  • 5. JavaScriptの変数スコープ - 実例2 n = 1; // グローバル function f() { // ←実はこれもグローバル n = 0; // グローバル return n; } alert(n); // 1 alert(f()); // 0 alert(n); // 0 関数内で「var」を付けた変数がローカルスコープとなる。 グローバル変数の宣言は「var」を付けても付けなくても変わらない。 Proprietary and Confidential to Lanchester Co.,LTD. Page 4
  • 6. ローカルスコープは関数全体で有効 function f() { for(var i=0; i<10; i++) { // 特に何もしないよ } alert(i); // ※ } f(); ※で「10」が表示される。 JavaScriptに「ブロックスコープ」は存在しない。 Proprietary and Confidential to Lanchester Co.,LTD. Page 5
  • 7. 関数名も変数なので function f() { g(); // FunctionDeclarationにより function g() { // 先に実行式があっても問題ない alert("localFunc"); } } f(); // localFunc と表示 g(); // スコープ外なので実行不可 今までの考え方をそのまま活用でき、その通りの結果となる。 Proprietary and Confidential to Lanchester Co.,LTD. Page 6
  • 8. 実は違った関数リテラルとFunction型 var n = 1; function f() { var n = 0; var s1 = new Function("", "alert(n);"); var s2 = function() { alert(n); }; s1(); // 1→グローバルを参照 s2(); // 0→ローカルを参照 } f(); ECMAScriptの仕様により、Functionコンストラクタで作られる関数はグ ローバルオブジェクトのスコープを参照して実行される。 Proprietary and Confidential to Lanchester Co.,LTD. Page 7
  • 9. 実は違った関数リテラルとFunction型 - 2 // var n = 1; function f() { var n = 0; var s = new Function("", "alert(n);"); // エラー } f(); グローバル変数nがないためそもそも定義しようとした時点でエラーとな ってしまう。 Proprietary and Confidential to Lanchester Co.,LTD. Page 8
  • 10. 仮引数もローカルスコープ var n = 1; function f(n) { n++; return n; } alert(f(10)); // 11 alert(n); // 1 同じ変数名だけど値渡しなのでグローバルのnはそのまんま。 Proprietary and Confidential to Lanchester Co.,LTD. Page 9
  • 11. 仮引数もローカルスコープだけど・・・参照型 var a = [1, 2, 3]; function f(v) { v[0] = 10; return v; } alert(f(a)); // 10, 2, 3 alert(a); // 10, 2, 3 違う変数名だけど参照渡しなので実体が変更される。 Proprietary and Confidential to Lanchester Co.,LTD. Page 10
  • 12. スコープチェイン var a = 1; function f() { var b = 2; function g() { var c = 3; return a + b + c; } return g(); } alert(f()); // 6 自分自身のスコープにない変数の場合スコープを順に辿っていき、変 数を探し出す。 Proprietary and Confidential to Lanchester Co.,LTD. Page 11
  • 13. ところでthisって <input type="button" value="test" id="btn"> <script type="text/javascript"> function where() { alert(this); } var o = { method: where }; document.getElementById("btn").onclick = where; where(); // [object Window] o.method(); // [object Object] // [test]ボタンクリック // [object HTMLInputElement] </script> 「誰の関数として実行されたか」 がthisに入ってくる。 特にイベントハンドラの場合には注意。 Proprietary and Confidential to Lanchester Co.,LTD. Page 12
  • 14. 本命:クロージャ(Closure、閉包) • 引数以外の変数を実行時の環境ではなく、自身が定義された環境( 静的スコープ)において解決することを特徴とする • Wikipediaより • ローカル変数を参照している関数内関数 • @ITより • 関数自身が定義された環境を、ローカル変数も含めて持ち運ぶことの できる仕組み(またはそうした関数自体) • ZDNet builderより ・・・何言ってんだか分かんねっす(´・ω・`) Proprietary and Confidential to Lanchester Co.,LTD. Page 13
  • 15. シンプルなクロージャ function closure(init) { var c = init; var f = function() { c++; return c; }; return f; } var counter = closure(5); alert(counter()); // 6 alert(counter()); // 7 alert(counter()); // 8 return fにより返された関数(counter)は、それが生成されたタイミング でローカルスコープだったcを閉じ込めて(Closure/閉包)いる。 Proprietary and Confidential to Lanchester Co.,LTD. Page 14
  • 16. 1つのクロージャを複数で使ってみる function closure(init) { var c = init; return function(){ return ++c; } } var c1 = closure(5); var c2 = closure(10); alert(c1()); // 6 alert(c1()); // 7 alert(c2()); // 11 alert(c2()); // 12 alert(c1()); // 8 alert(c2()); // 13 それぞれがclosureを実行したタイミングでクロージャが作られている。 Proprietary and Confidential to Lanchester Co.,LTD. Page 15
  • 17. 総決算 <input type="button" id="btn" value="設定"> <script type="text/javascript"> document.getElementById("btn").onclick = buttonState(true); function buttonState(flag) { return function() { flag = !flag; this.value = flag ? "設定" : "解除"; }; } </script> Proprietary and Confidential to Lanchester Co.,LTD. Page 16