関数とは?
関数とは何か?
タスクや表計算を実行する文の集まり:MDN ちょっとわかりにくい。。
料理で例えるなら
子供に料理を手伝ってもらうとき
- 兄:野菜を切ってもらう
- 弟:かき混ぜる
自分は炒めることに集中できる、この手伝ってくれる子供たちが関数
オブジェクトのメソッド = 関数
関数の宣言
// 普通の関数(メソッド)宣言 const foo = { alert: function () {}, } //省略した記述 const foo = { alert () {}, }
関数の基本
書式
function foo(仮引数1, 仮引数2) { return 関数の返り値 ; }, // 関数名は同士を先頭にしたり、キャメルケースがよく見られる function addName() {} //例 function cut(food) { //切る処理 const cutFood = food.slice(); return 関数の返り値; } // 関数を使用して、使いやすいように変数へ代入している const cutCarrot = cut(carrot); const cutPotato = cut(potato);
returnのないとき
returnが必要ない関数は、
- 料理を出す
- ゴミを捨てる
といった処理は返り値がいらない
ゴミ捨て係がいれば、その人にゴミを渡せば捨ててくれる
この場合は返してもらうものがないと理解することができる。
function throwAway (food) { delete food; // returnは付けない }
より具体的な例
function isTweetable(text) { return text.length <= 140 ; }; // return無しの関数 function alertTweetable(text) { if(isTweetable(text)) { alert("you can tweet!"); } };
匿名(無名)関数について理解する
関数は値として利用できる(関数式)
const isTweetable = function(text) { return text.length <= 140 ; };
関数ではfunctionの後に名前を書かないといけないが、書かなくても利用できるのが匿名関数となる。
コールバック関数について理解する
関数の中で関数を実行するもの
書式
function 高階関数(コールバック関数) { コールバック関数(); }
料理での例
手洗いで考える、子供に手を洗いしたか確認 自分で確認はめんどくさい、子供の
//通常 function bring(food) { if ( /* 手洗いを追えたら */ ) { // 食材を持ってきてもらう } } function peer(food) { if ( /* 手洗いを追えたら */ ) { // 食材の皮をむいてもらう } } function cut(food) { if ( /* 手洗いを追えたら */ ) { // 食材を切ってもらう } } //コールバック関数 // fn はfunctionの略 , 手洗いを終えたらやってほしい処理を引数として関数を渡す function washed(fn) { if (/* 手洗いを終えたら */) { fn(); //コールバック関数の処理 } } function bring(food) { // 食材を持ってきてもらう } function peer(food) { // 食材の皮をむいてもらう } function cut(food) { // 食材を切ってもらう }
変更点があるときに修正しやすかったり、コード全体の見通しがよくなる
具体的な例の自作
function unfollow() { console.log("フォローを外しました"); } function cancelTweet() { console.log("ツイートをキャンセルしました"); } function confirmed(fn) { if (window.confirm("実行しますか?")) { fn(); } } confirmed(unfollow); //匿名関数を利用する場合 const cancelTweet = function() { console.log("ツイートをキャンセルしました"); }; function confirmed(fn) { if (window.confirm("実行しますか?")) { fn(); } }; confirmed(cancelTweet); //直接関数の内容を渡すのも可能 //一度しか利用しないときはこのような形が利用される。 confirmed(function() { console.log("ツイートをキャンセルしました"); }); //githubの削除確認の例 function confirmed(fn) { const input = window.prompt("実行しますか?"); fn(input); } confirmed(function (input) { if (input == "実行") { console.log("リポジトリを削除"); } });
コールバック関数の使用例
const btn = document.getElementByID("button"); btn.addEventListener("click", function() { console.log("フォロー解除"); }); const foods = ["apple", "potato", "banana"]; foods.forEach(function(food) { console.log(food); });