SlideShare a Scribd company logo
ちょっと詳しくJavaScript 第2回【関数と引数】
2011年06月03日+2011年06月10日




                           株式会社ランチェスター
                           株式会社ランチェスター
                           TEL: 03-5775-3395 Fax:03-5775-3396
                           URL: http://www.lanches.co.jp/
ちょこっとだけ前回のおさらい
JavaScriptでは「Object」が最もシンプルなオブジェクト。
オブジェクトは様々な名前付きのプロパティを持てる。

var o = { prop : "val" };
alert(o.prop);          // 「val」と表示
alert(o["prop"]);       // これも

ちなみにここでの「o」もグローバルオブジェクト(ブラウザ内ならwindow
オブジェクト)のプロパティなので、

alert(this.o.prop);
alert(window["o"]["prop"]);

ということになります。

                    Proprietary and Confidential to Lanchester Co.,LTD.   Page 1
関数の定義による違い
FunctionDeclaration
       関数宣言

FunctionExpression
       関数式


FunctionStatement
       関数文(ECMAScriptにはなくJavaScript1.5からの拡張構文)
       (実装による問題が多く実践的ではないので説明しません)




                      Proprietary and Confidential to Lanchester Co.,LTD.   Page 2
FunctionDeclaration(関数宣言)
function f() {
        alert("func!");
}
f();    // 実行

if文などで実行文が1文の場合は { } を省略して
if(cond) alert("true");
という記述ができるが、function文は { } を省略することはできない。
※ 言語的な仕様による

関数を作る際に名前(ここではf)が存在するため
「名前付き関数」
などと呼ばれます。


                          Proprietary and Confidential to Lanchester Co.,LTD.   Page 3
FunctionExpression(関数式)
var f = function() {
        alert("func!");
}
f();    // 実行

if文などで(ry

関数を作る際には名前がなく、作った関数を変数fに代入しているだけ
なので
「無名関数」
などと呼ばれます。




                          Proprietary and Confidential to Lanchester Co.,LTD.   Page 4
~Declarationと~Expressionの違い
f();    // 実行可能
function f() {
        alert("func!");
}

g(); // 実行不可
var g = function() {
       alert("func!");
}

FunctionDeclarationはプログラムの実行に先立って評価されるためス
コープ内のどこにあっても問題なく実行できる。
FunctionExpressionは変数への関数(ポインタ的)代入が行われるまで
はundefined(未定義)となるため定義前には実行できない。

                          Proprietary and Confidential to Lanchester Co.,LTD.   Page 5
通称「名前付き無名関数」
var f = function n() {
        // ココ!
}

f();   // 実行可能
n();   // 実行不可

この形式が通称「名前付き無名関数」と呼ばれる状態。
ここで付けられた名前「n」は「ココ!」の中、つまり自分自身のスコープ
からしか参照できない。

何に使うねん・・・なんて思っちゃダメ。
無名関数を作りつつ再起処理を書きたいときに使えるのです!


                         Proprietary and Confidential to Lanchester Co.,LTD.   Page 6
関数もプロパティ(~Declaration編)
1.   alert(typeof(f));
2.   function f() { alert("func!"); }
3.   alert(typeof(f));
4.   f = "string!";
5.   alert(typeof(f));

概念的な実行順序は2→1→3→4→5となる。
2でfというプロパティに関数の代入が行われ、
1はfが関数のため「function」という表示がされ、
3でも当然「function」が表示される。
4で通常の文字列が代入されるため、
5では「string」と表示される。



                        Proprietary and Confidential to Lanchester Co.,LTD.   Page 7
関数もプロパティ(~Expression編)
1.   alert(typeof(f));
2.   f = function() { alert("func!"); }
3.   alert(typeof(f));
4.   f = "string!";
5.   alert(typeof(f));

実行順序は上から1→2→3→4→5となる。
1ではfが未定義のため「undefined」と表示される。
2でfというプロパティに関数の代入が行われるため、
3では「function」という表示がされる。
4で通常の文字列が代入されるため、
5では「string」と表示される。



                        Proprietary and Confidential to Lanchester Co.,LTD.   Page 8
Functionオブジェクト
ECMAScriptが標準的に持っているオブジェクト。

function f() {};
var f = function() {};
var f = new Function();

これらは(生成のタイミング以外ほぼ)等価です。
どっちがどっちのシンタックスシュガーという関係ではなく、内部的な変
数スコープの扱いが多少違います。

が、今回は同じものと思っておいて問題ありません。
※ 別の機会にちょっとだけ触れます



                     Proprietary and Confidential to Lanchester Co.,LTD.   Page 9
Functionオブジェクト
function f() {
        alert("func!");
};

に相当するFunctionオブジェクトの構築は

var f = new Function('alert("func!");');

のような形になります。




                          Proprietary and Confidential to Lanchester Co.,LTD.   Page 10
高階関数
「関数を引数にとる」、または「戻り値を関数とする」関数。

function add(a, b) { return a + b; }
function sub(a, b) { return a - b; }
function exec(func, a, b) { return func(a, b); }

alert(exec(add, 2, 3));                 // 関数としての「add」を渡している

そもそもプロパティとして関数を持っているので引数に渡すのも戻り値
で返すのも楽々。

この2つが簡単にできると「あのJava」が苦手なクロージャを簡単に作れ
ます。
が、クロージャについては割愛。

                      Proprietary and Confidential to Lanchester Co.,LTD.   Page 11
引数の個数(オーバーロードその1)
function disp(message) {
        alert(message);
}

よく見かける(?)こんな関数を次のように呼び出すと・・・

disp();                                // 「undefined」と表示
disp("Hello");                         // 「Hello」と表示
disp("Hello", "Good Bye");             // 「Hello」と表示

渡された実引数が順に仮引数に入っていく。
引数の数などは特にチェックされない。



                     Proprietary and Confidential to Lanchester Co.,LTD.   Page 12
argumentsオブジェクト
関数が実行された際に暗黙的に生成される引数等の情報を持ったオ
ブジェクトがプロパティとしてセットされる。
先ほどのdisp関数をargumentsオブジェクトを使って記述すると

function disp() {
        alert(arguments[0]);
}

のようになる。




                     Proprietary and Confidential to Lanchester Co.,LTD.   Page 13
argumentsオブジェクト
argumentsオブジェクトと引数を同時に扱うことも可能

function dispTotalScore(message) {
        var score = 0;
        for(var i=1; i<arguments.length; i++) {
                score += arguments[i];
        }
        alert(message + score);
}

dispTotalScore("Score is ", 10, 20, 30);                                    // 「Score is 60」

arguments[0]には当然messageと同じものが入っている。


                      Proprietary and Confidential to Lanchester Co.,LTD.                      Page 14
引数の型違い(オーバーロードその2)
var d = new Date(2011, 5, 10);                                            // 月は0~11
var d = new Date("June 10, 2011");

この2つは全く同じ日付「2011/06/10」を返すが、引数の個数、型が
いずれもバラバラ。

function myDate(yyyy, mm, dd) { … }
function myDate(dateString) { … }

こんな風に書いちゃうと当然上書きされてしまう。
どうすれば?




                    Proprietary and Confidential to Lanchester Co.,LTD.               Page 15
自分で(都合の良いように)頑張る
function dispType(v) {
        if( isNaN(v) ) {
                if( v instanceof Array ) {
                         alert("Array");
                } else {
                         alert("String");
                }
        } else {
                alert("Number");
        }
}
dispType([1,2]);
dispType("str");
dispType(12);

                       Proprietary and Confidential to Lanchester Co.,LTD.   Page 16
Functionオブジェクトで引数
var f = new Function("a", "b", "c", "return a+b+c");

var f = new Function("a, b, c", "return a+b+c");
var f = new Function("a, b", "c", "return a+b+c");

コンストラクタに渡された最後の引数が関数本体、その前に渡されたも
のを文字列としてカンマで連結したものが引数の名前となる。

var f = new Function("a, b,", "c", "return a+b+c");                         // エラー
var f = new Function("a, 0, c", "return a+b+c");                            // エラー




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

More Related Content

PDF
ちょっと詳しくJavaScript 第3回【prototype】
PDF
Functional Way
PDF
おいしいLisp
PDF
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
PPTX
大人のお型付け
PDF
そしてjsの基礎へ戻る#4
PDF
PHP5.5新機能「ジェネレータ」初心者入門
PPT
言語処理系入門4
ちょっと詳しくJavaScript 第3回【prototype】
Functional Way
おいしいLisp
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
大人のお型付け
そしてjsの基礎へ戻る#4
PHP5.5新機能「ジェネレータ」初心者入門
言語処理系入門4

What's hot (20)

PPTX
詳説ぺちぺち
PDF
Swift らしい表現を目指そう #eventdots
PDF
templateとautoの型推論
PDF
プロトコル指向 - 夢と現実の狭間 #cswift
PDF
From Java To Clojure
PDF
Lisp Tutorial for Pythonista : Day 3
PDF
JavaScript 勉強会 ― 変数・演算子・文
PDF
C++14 Overview
PDF
F#入門 ~関数プログラミングとは何か~
PDF
unique_ptrにポインタ以外のものを持たせるとき
PPTX
【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第5回 「配列 と レコード 」
PDF
traitを使って楽したい話
PPTX
Visual C++で使えるC++11
PDF
Emcjp item21
PDF
Lisp tutorial for Pythonista : Day 2
PPT
ジェネリクスの基礎と クラス設計への応用
PDF
Material
PPTX
【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第2回 ‟変数と型„
詳説ぺちぺち
Swift らしい表現を目指そう #eventdots
templateとautoの型推論
プロトコル指向 - 夢と現実の狭間 #cswift
From Java To Clojure
Lisp Tutorial for Pythonista : Day 3
JavaScript 勉強会 ― 変数・演算子・文
C++14 Overview
F#入門 ~関数プログラミングとは何か~
unique_ptrにポインタ以外のものを持たせるとき
【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第5回 「配列 と レコード 」
traitを使って楽したい話
Visual C++で使えるC++11
Emcjp item21
Lisp tutorial for Pythonista : Day 2
ジェネリクスの基礎と クラス設計への応用
Material
【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第2回 ‟変数と型„
Ad

Similar to ちょっと詳しくJavaScript 第2回【関数と引数】 (20)

PDF
ちょっと詳しくJavaScript 特別編【悪霊の神々】
PDF
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
PDF
F#によるFunctional Programming入門
PDF
Swift 2.0 で変わったところ「前編」 #cswift
PPTX
RubyとJavaScriptに見る第一級関数
PDF
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
PDF
BOF1-Scala02.pdf
PDF
BOF1-Scala02.pdf
PDF
BOF1-Scala02.pdf
PDF
Kanazawa.js.Next
PDF
第三回ありえる社内勉強会 「いわががのLombok」
PDF
Ekmett勉強会発表資料
PDF
Swift 2.0 で変わったところ「後編」 #cswift
PDF
from old Java to modern Java
PDF
たのしい関数型
PDF
プログラミング言語Scala
PDF
JavaScript入門
PDF
ATN No.2 Scala事始め
PDF
プログラマ講習第2回
PPTX
やや関数型を意識した風Elixir/Phoenixご紹介
ちょっと詳しくJavaScript 特別編【悪霊の神々】
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
F#によるFunctional Programming入門
Swift 2.0 で変わったところ「前編」 #cswift
RubyとJavaScriptに見る第一級関数
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
BOF1-Scala02.pdf
BOF1-Scala02.pdf
BOF1-Scala02.pdf
Kanazawa.js.Next
第三回ありえる社内勉強会 「いわががのLombok」
Ekmett勉強会発表資料
Swift 2.0 で変わったところ「後編」 #cswift
from old Java to modern Java
たのしい関数型
プログラミング言語Scala
JavaScript入門
ATN No.2 Scala事始め
プログラマ講習第2回
やや関数型を意識した風Elixir/Phoenixご紹介
Ad

More from 株式会社ランチェスター (20)

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

ちょっと詳しくJavaScript 第2回【関数と引数】