<commit_before>## 関数の宣言と式

関数はJavaScriptの第一級オブジェクトです。この事は、その他の値と同じように渡す事が出来るという事です。この機能で良く使われる一つとして**匿名関数**を他のオジェクトにコールバックとして渡すというものがあり、これで非同期での実装が可能になります。

### `関数`宣言

    function foo() {}

上記の関数はプログラムの開始時の前に評価されるように[巻き上げ](#function.scopes)られます。従って*定義*されたスコープ内の*どこでも*使用する事が可能になります。ソース内での実際の定義が呼ばれる前でもです。

    foo(); // このコードが動作する前にfooが作られているので、ちゃんと動作する
    function foo() {}

### `関数`式

    var foo = function() {};

この例では、`foo`という変数に無名で*匿名*の関数が割り当てられています。

    foo; // 'undefined'
    foo(); // これはTypeErrorが起こる
    var foo = function() {};

`var`は宣言である為に、変数名`foo`がコードが開始される実際の評価時より前のタイミングにまで巻き上げられています。`foo`は既にスクリプトが評価される時には定義されているのです。

しかし、コードの実行時にのみこの割り当てがされるため、`foo`という変数は対応するコードが実行される前にデフォルト値である[undefined](#core.undefined)が代入されるのです。

### Named Function Expression

Another special case is the assignment of named functions.

    var foo = function bar() {
        bar(); // Works
    }
    bar(); // ReferenceError

Here `bar` is not available in the outer scope, since the function only gets
assigned to `foo`; however, inside of `bar` it is available. This is due to 
how [name resolution](#function.scopes) in JavaScript works, the name of the 
function is *always* made available in the local scope of the function itself.

<commit_msg>translate "Named Function Expression" to ja<commit_after>## 関数の宣言と式

関数はJavaScriptの第一級オブジェクトです。この事は、その他の値と同じように渡す事が出来るという事です。この機能で良く使われる一つとして**匿名関数**を他のオジェクトにコールバックとして渡すというものがあり、これで非同期での実装が可能になります。

### `関数`宣言

    function foo() {}

上記の関数はプログラムの開始時の前に評価されるように[巻き上げ](#function.scopes)られます。従って*定義*されたスコープ内の*どこでも*使用する事が可能になります。ソース内での実際の定義が呼ばれる前でもです。

    foo(); // このコードが動作する前にfooが作られているので、ちゃんと動作する
    function foo() {}

### `関数`式

    var foo = function() {};

この例では、`foo`という変数に無名で*匿名*の関数が割り当てられています。

    foo; // 'undefined'
    foo(); // これはTypeErrorが起こる
    var foo = function() {};

`var`は宣言である為に、変数名`foo`がコードが開始される実際の評価時より前のタイミングにまで巻き上げられています。`foo`は既にスクリプトが評価される時には定義されているのです。

しかし、コードの実行時にのみこの割り当てがされるため、`foo`という変数は対応するコードが実行される前にデフォルト値である[undefined](#core.undefined)が代入されるのです。

### 名前付き関数宣言

他に特殊なケースとして、命名関数があります。

    var foo = function bar() {
        bar(); // 動作する
    }
    bar(); // ReferenceError

この場合の`bar`は`foo`に対して関数を割り当てるだけなので、外部スコープでは使用できません。しかし、`bar`は内部では使用できます。これはJavaScriptでは[名前解決](#function.scopes)による動作です。関数名は*いつも*関数自体のローカルスコープ内で有効になっています。


{'fraction_non_alphanumeric': 0.12046632124352331, 'fraction_numerical': 0.0, 'mean_word_length': 6.0, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3364837', 'n_tokens_mistral': 1493, 'n_tokens_neox': 1317, 'n_words': 137}