2017-11-14 12 views
4

この質問は、関数宣言のVS関数式を考慮して生まれました。「関数宣言」を「関数宣言」として定義することはできますか?

は、我々は明らかに関数宣言は、関数式は、このフォームを持つことができますしながら、

function foo() { 
    var a = 3; 
    console.log(a); 
} 

(function foo() { 
    var a = 3; 
    console.log(a); 
})() 

が見て(すぐに呼び出される関数式のように知られているもののように表示される)このフォームを持っていることを知っています直ちに呼び出される関数式は、関数宣言で使用される最初の関数がparethesisで囲まれていることに気づくだけです。

ここでポイントは次のとおりです。グループ化演算子(最もよく知られている「parethesis」())には式しか含めることができません。これが真実であれば、関数宣言もfunctionステートメントであるとは言えません(なぜなら、括弧内にステートメントをラップしていると言えるからです)。

だから、助けてもらえますか、少し混乱します。 関数宣言も関数宣言ですか? 「はい」の場合は、かっこで囲まれた関数が文または何ですか?

私は、関数宣言と関数式の違いについて質問していないことを明確にする必要があります。私がそれらに言及してその違いが私の質問を記述するだけです: "関数宣言"も "関数ステートメント"ですか?

+1

多くの式もステートメントです。 –

+1

"関数式は、関数式と非常によく似ており、関数式とほぼ同じ構文を持っています(詳細はfunctionステートメントを参照)。関数式と関数ステートメントの主な違いは、関数式で省略できる関数式は定義されるとすぐに実行されるIIFE(Immediately Invoked Function Expression)として使用できます。 " - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function – zfrisch

+0

[式とステートメントの違いは何ですか?](https://stackoverflow.com/questions/32343679/what-is-the-difference-between-an-expression- and-a-statement) – zfrisch

答えて

1

Inでは、ホイストは発生しませんが、関数文のホイストが発生します。

関数ステートメントでは、関数呼び出しの前後にjsファイルのどこにでも関数定義を書くことができます。 JITコンパイラはプログラミングファイルの上に吊り上げます。

関数式の場合、JITコンパイラはfunctionステートメントと同じ動作をしません。functionステートメントは、発生した場所を読み取ります。定義された関数の前に関数にアクセスしようとすると、型エラーが表示されます。

IIFEは、外部からのアクセス変数を避けるためによく使用されるパターンです。

callMe(); // Function statement 
 

 
function callMe(){ 
 

 
return console.log("I am function statement"); 
 
} 
 

 

 
// callMe2(); // TypeError if you call before expression defined. 
 

 
var callMe2 = function(){ 
 
    return console.log("I am function expression"); 
 
}; 
 

 
callMe2(); //Function expression call 
 

 
(function(){ 
 
return console.log("I am IIFE"); 
 
}());

3

関数式の構文は、関数宣言と同じであるが、それらは同じものではありませんね。

関数宣言で使用される名前のスコープは、名前付き関数式とは異なります。あなたが書くとき:

function foo() { 
    var a = 3; 
    console.log(a); 
} 

を(これはトップレベルである場合や、地球環境)fooの範囲は、外側の関数です。

あなたが書いた:

(function foo() { 
    var a = 3; 
    console.log(a); 
}) 

fooの範囲は、関数の本体だけです。

パーサは、コンテキストに基づいて関数式であるか宣言であるかを判断します。ステートメントはカッコ内に入れることはできないため、カッコをかっこで囲むと、そのステートメントが強制的に式になります。

関連する問題