はじめに
オライリー社の「ハンズオンJavaScript」を読みながら、気づいたことや、重要と思われるポイントをメモしていきます。
今回は、第3章「処理を学ぶ」です。
式、文、関数定義などに関する内容になっています。
変数のスコープ
{
let a = 3;
console.log(a);
}
console.log(a);
上のコードを実行すると、2回目のconsole.log(a)のところで、ReferenceErrorの例外が投げられます。
Uncaught ReferenceError: a is not defined
at <anonymous>:5:13
スクリプト言語によっては、変数がない時は、勝手に宣言して先に進むことがありますが、JavaScriptでは例外が投げられますね。
様々なforの書き方
まずはオーソドックスな書き方。
> for (let i = 0; i < 3; i++) {
console.log(i);
}
1
2
3
他の言語でもよく見られる書き方ですね。
次に、配列を指定して、1つずつ取り出すときに使える、for-of文。
> const array = [1, 2, 3];
> for (const i of array) {
console.log(i);
}
1
2
3
次に、オブジェクトを指定して、プロパティを1つずつ取り出せる、for-in文。
> const obj = {a: 1, b: "bbb", c: [true, false]};
> for (const param in obj) {
console.log(param + ":" + obj[param]);
}
a:1
23:15:18.246 VM374:3 b:bbb
23:15:18.246 VM374:3 c:true,false
paramには、プロパティ名が入ります。ブラケット記法([])を使うことで、プロパティの値も取得できます。
関数の定義
関数は3つの方法で定義できます。
以下は、関数宣言
function sum(a, b) {
return a + b;
}
以下は、関数式
let sum = function(a, b) {
return a + b;
}
柔軟性が高い指定方法です。
関数を変数にセットすることで、関数呼び出し時の引数にそれを指定することができます。
なお、関数を引数として受け取る関数のことを、高階関数と呼びます。
また、関数の戻り値として関数を返すこともできます。
以下は、アロー関数
let sum = (a, b) => {
return a + b;
}
コールバック関数などでよく見られる形式です。
本書では、内部の動作で改善されているため、アロー関数を使用することを勧めてました。
個人的には、コールバック関数以外でこれを見かけると、違和感を覚えそうです・・。
仮引数には、デフォルト値を指定可能です。
> function sum(a, b = 2) {
return a + b;
}
> sum(1);
3
取りうる引数の数を可変にしたい時は、残余引数を使います。
残余引数は、仮引数の最後に来るよう、指定します。
> function sum(a, b, ...others) {
let result = a + b;
for (i of others){
result += i;
}
return result;
}
> sum(1, 2, 3, 4);
10
関数の部分適用
一部の引数だけに、値を適用しておくことができます。
これを関数の部分適用と呼びます。
> function sum(a, b){
return a + b;
}
> function sumPartial(a){
return function(b) {
return sum(a, b);
}
}
> const aaa = sumPartial(1);
> aaa(2);
これまで、このような使い方をしたことはなかったのですが、プログラム内で処理を行っていく中で、徐々に計算で使用する値が決まっていくようなシーンがあれば、利用できそうです。