2016-10-08 15 views
1

「Head First Javascript」の464と465ページには、矛盾する2つのステートメントがあります。JavaScript関数宣言は関数への参照を返しますか?

P 464

ブラウザは、関数宣言を評価し、それが 関数と同様の機能と同じ名前を持つ変数、及び 格納する変数の関数の参照を作成します。

P 465

関数宣言、関数への参照を返しません。 ではなく、関数の名前で変数を作成し、新しい関数 を割り当てます。

これはどちらですか?インタプリタが関数宣言を見て変数を作成すると、に関数が割り当てられているか、その変数にの参照が割り当てられていますか?

「関数宣言は関数への参照を返さない」というステートメントは間違っていますか?

+0

こんにちは、あなたはあなたの質問でそれらを言及していないので、[java]と[C++]タグを削除しました。 – hexafraction

+1

See - > https://jsfiddle.net/2vz577n2/1/ – adeneo

答えて

2

JavaScriptは実際には2つを区別しません。

オブジェクトである値を持つたびに、値は実際にそのオブジェクトへの参照になります。

(関数はJSのオブジェクトの一種に過ぎないことに注意してください)。

関数宣言は何も返すことはできません。関数の宣言では、左辺を持つ場所には存在できません(そうした場合は、関数式であり宣言ではありません)。現在のスコープ内で同じ名前の変数を作成します。

+0

"関数宣言は関数への参照を返さない"というステートメントは間違っていますか? – user1142130

+0

いいえ、何も返す必要はありません。その場合は式になります。ただし、関数に与えられた名前の変数を作成し、その変数への参照を割り当てます。そのため、後で関数を呼び出すことができます – adeneo

0

オブジェクトは「参照値」であり、関数はオブジェクトです。 「オブジェクト」または「オブジェクトへの参照」と言ったとき、通常は同じことを意味します。関数と同じです。

「関数宣言が関数への参照を返さない」というステートメントは間違っていますか?

いいえ、正しいです。しかし、ここでの「機能」または「機能への参照」の区別はなく、に重点があり、を返しません。宣言は式ではなく文であるため、結果の値はありません。

+0

したがって、関数式は常に関数の参照を返しますか? – user1142130

+0

はい、関数式の結果が新しい関数 – Bergi

1

彼らはどちらも同じことを少し違った形で言っています。

私はあなたがトップのステートメントが関数が参照を返すと言っていると仮定していると思います。ブラウザは、関数宣言を評価するとき、それは同じ名前として持つ変数としてだけでなく 関数を作成し、

P 464

省略部分で、このような文を読みます関数を呼び出し、 は関数参照を変数に格納します。

P 465

関数への参照を返さない 関数宣言。 ではなく、 は関数の名前で変数を作成し、その関数に新しい関数 を割り当てます。

ここで、省略された部分をどちらのステートメントにも追加できます。彼らは同じことを言っているが、関数宣言が関数への参照を返さないことを明らかにしている。最初の声明は何かを返すとは言わないので、これは矛盾しない。

最初の文は、関数と同じ名前で作成された変数に関数参照を格納していることを示しています。これは関数宣言が何かを返すとは仮定しないでください。

宣言と呼び出しの間に混乱があるようです。両方の非常に単純な定義があります。

宣言

何何かを定義するという行為は、このような変数、オブジェクト、メソッド、または関数として、です。 JavaScriptでは、関数を宣言しても何も返されません。

function func() { 
    return "returned"; 
} 

またしかし、これは宣言を意味するものではありません。この

var funk = function func() { 
    return "returned"; 
} 

が何かを返し行うことができます。単に、funkが関数への参照を指していることを意味します。後でfunk()を使用して、この関数を呼び出すことができます。

呼び出し

呼び出し、または、関数またはメソッドを実行する動作。

func(); 

上記は、宣言で定義されているように "returned"を返します。 JavaScriptでは、関数自体の宣言は何も返しません。

+0

への参照になります。関数宣言に変数があり、その変数に関数への参照が含まれている場合、関数への参照を返しているとは言えませんか?それは参照を含んでいます、そうですか? – user1142130

+0

この文脈では「return」という言葉は特に「return」というキーワードを指していますか?同義語ではないcontains – user1142130

+0

関数宣言は参照を返しません。私はあなたが用語宣言と混同していると思います。関数はこの時点で呼び出されていません。宣言は何も返さない。関数を呼び出すと、何かを返すことができますが、これは呼び出しに関するものではなく、宣言に関するものです。 – adpro

関連する問題