2017-02-15 2 views
2

は、私は出力が「1function」であろうと予想さ

var y = 1; 
 
if (function f(){}) { 
 
    y += typeof f; 
 
} 
 
console.log(y);

以下のコードの出力を理解していません。しかし、実際の出力は「1undefined」です。私の知る限りでは、関数宣言が呼び出され、if文の中に関数fへのアクセスがあります。しかし、なぜ関数が宣言されていないかのように定義されていないのはなぜですか?

+4

これは条件の関数宣言ではなく、名前付き関数式です。関数式の名前は関数内でのみ利用可能であるため、この例の 'f'は' if'ブロック内に全く定義されていません。 'y'をログに記録しようとすると、エラーが発生します。 – Teemu

+0

も参照してください。http://stackoverflow.com/questions/10069204/function-declarations-inside-if-else-statements –

+0

ああ、タイプミスです。「f 'をログに記録しようとすると... " もちろん。 – Teemu

答えて

2

条件内に関数を宣言することはできません。すぐに外に関数宣言を置くように、if文の前に、あなたが条件で、それを使用することができますし、期待通りの結果は次のようになります。

var y = 1; 
 
function f(){} 
 
    if (f) { 
 
    y += typeof f; 
 
    } 
 
    console.log(y);

編集:まあ、結局のところあなたは実際には(*のように)CANできますが、選択した表記ではできません。これは動作します:

var y = 1, f; 
 
    if (f = function(){}) { 
 
    y += typeof f; 
 
    } 
 
    console.log(y);

を*テームはコメントで述べたように、これは本当に関数宣言ではなく、変数fに譲渡され、参照先の匿名関数ではありません。

+1

2番目のスニペットには、条件に関数式がありますが、今回は匿名です。あなたは本当に式が必要な場所に関数を宣言することはできません。 – Teemu

+0

良いキャッチ - これをさらに説明するための編集を行いました。より良い? :) – Connum

+0

@downvoter:細部まで行きますか? – Connum

関連する問題