読者です 読者をやめる 読者になる 読者になる

「パーフェクトJavaScript」メモ 6章 関数とクロージャ

関数宣言文で宣言した関数は、宣言した行より前のコードから呼べます。(巻き上げ)

いつも律儀に不安がっている

argumentsオブジェクトで実引数にアクセスできる

仮引数(parameter)、実引数(arguments)。
argumentて議論とか口論という意味だけど、論拠という部分が意味の元なのか?
数学分野では独立変数のことか。論理学での意味「項」からの転用かな

にしても、実引数にアクセスしてるんではなくて仮引数にアクセスしているように見える。

jsではローカル変数のスコープは関数内で宣言した後の領域ではなく、その関数全域にあたる。そのため、関数内で変数を宣言するときは関数の先頭でまとめて行うことを推奨する

これは何も考えず先頭に書けばいいのということならありがたい。

jsにはブロックスコープはないが、letを用いてブロックスコープを使うことができる(独自拡張)

まったくお目にかからない。for文の初期化式で使うと普通に便利だと思うのだが

入れ子が面倒な配置になって「どちらの関数が外側かわからず名前解決がうまく動作しない」ということはないのだろうか。

シャドーイングはバグの元なので避けよう

基本的に変数は毎回唯一無二のものをつけようということでいいか。
iとかよく重複しそうだけど。

関数はオブジェクト

関数はプロパティの集合。プロパティの読み書きもできる(そうか)

オブジェクトには本質的に名前がない

頻出するセンテンスなのでメモっておく。

クロージャ

出た

クロージャは状態を持つ関数である(表層的な理解その1)
クロージャは関数を抜けた後にも生きているローカル変数である(表層的な理解その2)

JavaScriptでは関数を呼ぶ度にCallオブジェクトが暗黙に生成されます。(中略)Callオブジェクトは関数呼び出しが終わると消滅します。

急に原文ママ
関数オブジェクトはg()とかカッコつきのときにCallオブジェクトが生成される(関数が実行される)が括弧つきじゃないとCallオブジェクトは生成されないし単に関数オブジェクトの参照を返すのみ。

(前略)g2とg3の呼び出し結果は異なります。これは同じコードから異なる状態を持つ関数を作れたことを意味します。

いまのところ表面的には、引数に値を入れた状態で変数として保存できる、というだけに見えるが。

クロージャのイディオムとして関数リテラル式をそのままreturn文に書くことが多い

全てがそうだとは限らない

クロージャ名前空間の汚染を防ごう

実用的具体例をありがとうございます

コールバック

動きは理解できたと思うが実践例をもっと見たい。
jQueryとかのライブラリでよく出てくるコールバック関数は内部的にはこんなかんじになっているということか。


6章終了。5章に比べ短かかった。