javascript 第8章 関数

関数について書いてく。数学嫌い系の僕からすると、関数って聞いた時点で悪寒が走るんやけど頑張る。javascriptにおける関数は、他の言語の「サブルーチン」や「プロシージャ」と呼ばれるものと同じものらしい。データベースあたりでプロシージャって聞いたことあるけど、関数と同じって言われると親近感湧くな。
関数は引数をもつことができて、パラメータと呼んだりもするんやけど、超便利っぽい。で、関数をオブジェクトのプロパティに代入したりもできるんやけど、その場合そのオブジェクトのメソッドっていったりする。名前変えんなやボケ。
また、関数は入れ子にすることができて、入れ子にされた関数は、定義されたスコープ中の変数にアクセスできる。ここらへんの話でレキシカル環境っていうのが出てくるねんけど、これは変数がアクセスできる環境のことと思えばいいんちゃうかな。でその環境にアクセスできる関数のことをクロージャって言うらしい。ここはほんまに今でもようわからんけど、変数のアクセスは機能を格上で重要やし理解しようと思う。

関数の定義について書いてく。関数の定義方法は3つくらいなんかな。本には三つしか書いてなかった。
関数宣言文と関数式とアロー関数の三つな。それぞれ、関数を定義するものやけどそれぞれ違う特徴を持ってるから注意してかなあかんで。
それぞれ下記のように書く。

function sayHello(){}  //関数宣言文
const sayHello = function (){} //関数式
const sayHello = () => {} //アロー関数

関数宣言文は、スクリプトや関数の先頭に巻き上げられるから、さきに呼ぶだし式を書いてもエラー吐かへんねんけど、関数式とアロー関数は巻き上げられへんから注意。で、関数宣言文と関数式の入れ子型の関数は、thisの値を継承しやんくて、非strictモードやとthisはグローバルオブジェクトに、strictモードやとundefinedになる。アロー関数をつかった入れ子型の関数はthisの値を継承するから使い分けてもいいかも。先の二つでも入れ子型の関数でthisの値を使うには、入れ子にしている関数で、thisを変数に入れるとアクセスできるようになるらしい。ちなみにアロー関数はES2015に追加された機能。

関数の呼び出し方は割愛するわ。と言いたいところやけど、暗黙的な関数呼び出しについては触れておこうと思う。
関数呼び出しを明示的にしてるわけではないのに実際は関数を呼び出してる場合がある

  • オブジェクトにセッターやゲッターが定義されてる時

  • 例えば、数値を文字列のように扱ったときに、数値を文字列に自動でかえてくれるのも暗黙的な関数呼び出し。

  • 反復可能なオブジェクトをループさせたとき

  • タグ付きテンプレートリテラル。

  • Proxyオブジェクトの動作。

ループの話とproxyの話は別で詳しく書かれてるらしい。からそれまでお預け。

関数の引数は、可変長な引数の設定とかできたりする。昔は可変長にするにはArgumentsオブジェクトっていうのを使ってたらしい。配列のようなオブジェクトやからforループつかって、数値インデックスで読み出すことができる。で、ES2015からはfunction(…args)っていう感じで「…」を書くことでそれが定義できるようになったらしいわ。引数で使われてる「…」はオブジェクトや配列で使うスプレッド演算子とは違うことに注意。
ちなみに引数には型もないし、可変長にできることから数も数えてへん。
やから、引数をつかって型を識別したかったら条件式使わなあかん。

関数って奥深いな。


この記事が気に入ったらサポートをしてみませんか?