
JavaScriptのイベント処理:クリック、フォーム入力からバブリング・デリゲーションまで
はじめに JavaScriptのイベント処理は、インタラクティブなウェブアプリケーション開発の核心です。ユーザーのクリック、フォーム入力、キーボード操作など、あ […]
関数はJavaScriptにおける重要な構成要素で、特定のタスクを実行するコードブロックです。関数を使うことで、コードの再利用性、可読性、保守性が向上します。
// 関数宣言
function greet(name) {
return `こんにちは、${name}さん!`;
}
// 呼び出し
console.log(greet('太郎')); // こんにちは、太郎さん!
特徴:
// 関数式
const greet = function(name) {
return `こんにちは、${name}さん!`;
};
// 呼び出し
console.log(greet('花子')); // こんにちは、花子さん!
特徴:
// アロー関数
const greet = (name) => {
return `こんにちは、${name}さん!`;
};
// 簡潔な構文(単一式の場合)
const square = x => x * x;
特徴:
this
のバインドが異なる(後述)function add(a, b) {
return a + b;
}
const result = add(3, 5); // 8
const calculator = {
add: function(a, b) {
return a + b;
}
};
calculator.add(2, 3); // 5
function Person(name) {
this.name = name;
}
const person = new Person('太郎');
function greet() {
console.log(`こんにちは、${this.name}さん!`);
}
const user = { name: '花子' };
greet.call(user); // こんにちは、花子さん!
function greet(name = 'ゲスト') {
console.log(`こんにちは、${name}さん!`);
}
greet(); // こんにちは、ゲストさん!
greet('太郎'); // こんにちは、太郎さん!
function sum(...numbers) {
return numbers.reduce((acc, num) => acc + num, 0);
}
console.log(sum(1, 2, 3)); // 6
console.log(sum(1, 2, 3, 4, 5)); // 15
function printUser({ name, age }) {
console.log(`${name}さんは${age}歳です`);
}
const user = { name: '太郎', age: 25 };
printUser(user); // 太郎さんは25歳です
// 戻り値がある関数
function add(a, b) {
return a + b;
}
// 戻り値がない関数(undefinedを返す)
function noReturn() {
// 何も返さない
}
let globalVar = 'グローバル';
function testScope() {
let localVar = 'ローカル';
console.log(globalVar); // アクセス可能
console.log(localVar); // アクセス可能
}
testScope();
console.log(globalVar); // アクセス可能
// console.log(localVar); // エラー(アクセス不可)
// 関数を引数に取る関数
function operate(a, b, operation) {
return operation(a, b);
}
function add(x, y) { return x + y; }
function multiply(x, y) { return x * y; }
console.log(operate(3, 4, add)); // 7
console.log(operate(3, 4, multiply)); // 12
// コールバックを使用した非同期処理の模倣
function fetchData(callback) {
setTimeout(() => {
callback('データ');
}, 1000);
}
fetchData(data => {
console.log('取得したデータ:', data);
});
// 定義と同時に実行
(function() {
console.log('即時実行');
})();
// スコープを隔離する用途で使用
(function() {
let privateVar = '外部からアクセス不可';
// ここでの変数は外部から見えない
})();
// 階乗を計算する再帰関数
function factorial(n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
console.log(factorial(5)); // 120
function multiply(a, b) {
return a * b;
}
function sayHello(name = 'ゲスト') {
console.log(`こんにちは、${name}さん!`);
}
sayHello();
sayHello('太郎');
function sum(a, b) {
console.log(a + b);
}
const result = sum(2, 3);
console.log(result);
function sum(a, b, c) {
return a + b + c;
}
let x = 10;
function updateX() {
x = 20;
}
updateX();
console.log(x);
function mapArray(arr, transform) {
const result = [];
for (let item of arr) {
result.push(transform(item));
}
return result;
}
printObject
を作成しなさい。factorial(4)
の呼び出し時の実行フローを追跡しなさい。 function factorial(n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
add
を作成しなさい。以下のように動作するものとします。console.log(add(2)(3)(4)()); // 9
console.log(add(1)(2)()); // 3
createCounter
を実装しなさい。const counter1 = createCounter();
console.log(counter1()); // 1
console.log(counter1()); // 2
const counter2 = createCounter(10, 5);
console.log(counter2()); // 15
console.log(counter2()); // 20
// 関数式
const multiply = function(a, b) {
return a * b;
};
// アロー関数
const multiply = (a, b) => a * b;
こんにちは、ゲストさん!
こんにちは、太郎さん!
function sayHello(name = 'ゲスト') {
console.log(`こんにちは、${name}さん!`);
}
sayHello(); // こんにちは、ゲストさん!
sayHello('太郎'); // こんにちは、太郎さん!
// 間違い: console.logで出力しているだけで値を返していない
// 修正例:
function sum(a, b) {
return a + b;
}
function sum(...numbers) {
return numbers.reduce((acc, num) => acc + num, 0);
}
20
let x = 10;
function updateX() {
x = 20; // 宣言してないのでグローバル変数として認識される
}
updateX(); // 関数内でグローバル変数xを更新しているため
console.log(x);
function isPositive(num) {
if (num > 0) {
return "positive";
} else if (num < 0) {
return "negative";
} else {
return "zero";
}
}
const doubled = mapArray([1, 2, 3], x => x * 2);
// [2, 4, 6]
printObject
function printObject(obj) {
for (const key in obj) {
console.log(`${key}: ${obj[key]}`);
}
}
factorial(4)
の実行フロー factorial(4)
→ 4 * factorial(3)
→ 3 * factorial(2)
→ 2 * factorial(1)
→ 1 (ベースケース)
→ 2 * 1 = 2
→ 3 * 2 = 6
→ 4 * 6 = 24
add
function add(a) {
return function(b) {
return function(c) {
return function() {
return a + b + c;
};
};
};
}
関数のカリー化とは、一回性で必要な引数を入れるのではなく、あらかじめ関数の引数を数段階に分けて、段階別に引数を自由に操作できる構造です。
function fibonacci(n, memo = {}) {
if (n in memo) return
memo[n];
if (n <= 1) return n;
memo[n] = fibonacci(n - 1, memo) + fibonacci(n - 2, memo);
return memo[n];
}
createCounter
関数:javascript function createCounter(initial = 0, step = 1) {
let count = initial;
return function() {
count += step;
return count;
};
}