竹林のゆとりブログ

山奥で生活し、日々の思いをつらつらと書くブログ。 IT、数学、アニメなど。

Javascript要約②

Javascript: The Good Parts(http://bdcampbell.net/javascript/book/javascript_the_good_parts.pdf) の4章を軽くまとめてみました。今回は対象の量が多かったため、相当はしょって要約しています。

Chapter 4 function

Introduction

functionの実装がjavascriptにとってBestなもの。 ただし、全てが完璧というわけではない。 functionがモジュール分割の基本的な単位

Function Objects

JavascriptにおけるFunctionはobjectであり、任意のfunctionはFunction.protypeでつながっている。

functionはobjectなので値として呼び出せる。特異なのは呼び出しができること

function Literals

function 関数名 (parameter) {

処理 }

となっている。

関数名のないものはanonymousと言われている。

Invocation

invokeされると、指定されたparameter以外にthis,argumentsという二つの変数が得られる これらは呼び出され方によって値が変わる。

 The method invocation pattern

objectの一つのvalueとして functionが定義されるもの

var abc = {
  a : "hello":
  b: function (x){
    this.a =  this.a + x;
  }
}

ちなみに、この場合は abc.b("world")でhelloworldとなる。

この時,thisはこのobjectをさすことになる。

Thf function invocation pattern

var a = add(3,4);

となる場合(addは足し算をするfunction)

thisはglobal scopeをさす

本来は呼び出されたscopeに合わせるべきなのにこれはおかしいと主張

例えばobject内で呼び出すときにthisをうまく使えないというデメリットがある。 var aaa{ value : 2; double : add(this.value,this.value); } はうまくいかない。

そのため

var aaa{
value = 2,
that = this
double : add(that.value,that.value);
}

として対応する。

The contsructor invocation option

new を使ってconstructorとして利用する場合の話

var a = function(x)[
 this.status = x;
];

に対し、new a("abc")とできる。

クラスの感覚に近い操作でものが作れるが非推奨。 thisの値は不明。おそらくaをさす

The Apply Invocation Pattern

apply(this,array) (arrayはなくても問題ない) thisを自分で指定できる。

Arugments

関数を呼び出すときに、呼び出す側の引数の個数が、function で定義されているものより、多くてもよい。 多い分はargumentsと言われる、配列に格納され、それ以降で使われる。

Return

returnを設定することで、functionを途中で終わらせられることと返り値を定義できる。 returnがない場合はundefinedが返り値として設定される。

Exception

例外。普通です。 例外を発生させるときはthrow. 例外が起きた場合に起きたルートに移動させるのはtry catch

Augumentation types

Number.Stringなどすでに定義されているobjectにメソッドを追加することで、簡単に大規模な修正ができる。 しかしlibraryと組み合わせるときは注意が必要

recruision

再帰。 DOMでよく使われる。 うまく使わないとメモリを大量に消費してします。

scope

C等と違って{}でくくったブロックはscopeにならない?objectの変数はアクセスできることを言っている? 関数はscopeになり、関数内の変数は外部からアクセスできないようになっている。

Closure

Clousreの一番最初の例の最後の()わからん…。returnの内部で利用されている関数に値を渡す必要があるから定義されている? されていないとうまくいかないのか不明。 functionの復帰値側で編集することで、外部からアクセスをさせないPrivateな値を作成できる。

おそらく、関数の中に関数を作ることで、内部からはアクセスでき、外部からはアクセスできないものたちが作れること。 関数はreturnなどで終了し、そのreturnで実施される処理がreturnの後にあっても実行できることが珍しいと言っている。

Callback

関数の呼び出し。 例が理解不能。非同期になるのは関数自体が非同期だから非同期になるの?

Module

Fucntionと値のやりとりをできる範囲。

Cascade

単純にメソッドの合成です。左からよまれるのでしょう。

curry

複数引数の関数から一部の引数に値をあてて、違うものにできる。 ただし、Javascriptに本来あるものではなく、自分で関数を使うことができる。

memoization

再帰でメモリを大量に使わないように一度計算した値たちを配列等にして残して置き、再帰時にメモリの使用量を減らす

まとめ

こうしてみると、仕様というよりは便利な使い方や特殊な例がたくさん書かれている気がします。 もっと原則的に書けないものかと思いますが、それも難しいのでしょうね。

説明の中では、Argumentsがすごく違和感がありますね。勝手に使ってくれるって不思議な気がします。 柔軟すぎて、不親切なレベルだと感じていますが、みなさんはどうでしょうか。