書く理由:
JSで関数を書くとき、通常、慣習関数fn(){}の形式で関数を宣言します。優れたプラグインを読むとき、var fn = function(){}などの関数の作成を確認せざるを得ません。それらの違いは何ですか?今日、私たちはキャセロールを最後まで壊す精神の中でこの魅力的な機能声明について話します。
関数宣言
関数宣言サンプルコード
コードコピーは次のとおりです。
関数fn(){
console.log( 'fn function execution ..');
//コード..
}
このようにして、fnという名前の関数を宣言します。これが考えです。この関数で呼び出されると実行されると思いますか?または、エラーが報告されますか?
fn(); //前に宣言したFN関数を呼び出します
コードコピーは次のとおりです。
関数fn(){
console.log( 'fn function execution ..');
//コード..
}
コンソール出力結果:
はい、FN関数は現時点で呼び出すことができますので、ここで理由を要約しましょう。
要約:
1:この時点で、FN関数は変数の結果であり、デフォルトでグローバルコンテキストで変数に保存されます(ウィンドウで検証できます。関数名)
2:この方法は関数宣言であり、グローバルコンテキスト段階に入り、コード実行段階を入力するときにすでに利用可能です。 PS:JavaScriptは、メソッドに入るたびにコンテキスト環境を初期化します(グローバル→ローカルから)
3:変数オブジェクトに影響を与える可能性があります(コンテキストに保存されている変数のみに影響します)
関数式
関数式サンプルコード
コードコピーは次のとおりです。
var fn = function(){
console.log( 'fn function [expression]宣言実行...')
//コード..
}
それでは、匿名の関数を宣言し、その参照を変数FNに指しますか?
繰り返しますが、コンソールの出力結果を確認するために、この式で宣言された関数の上下に1回呼び出します。
コードコピーは次のとおりです。
//コンソールの出力を明確に見るために、読みやすさを向上させるために各呼び出しの前後にマークを付けます。
console.log( '呼び出しが始まる前...');
fn();
console.log( '前の呼び出しが終了...');
var fn = function(){
console.log( 'fn function [expression]宣言実行...')
//コード..
}
console.log( 'その後に呼び出しが始まります...');
fn();
console.log( 'その後に呼び出しが始まります...');
コンソール印刷結果:
FN()関数が呼び出されたときにコードが初めて実行されると、プロンプトは次のとおりです。FNは関数ではなく(FNはメソッドではありません)、操作はエラーに遭遇すると終了します。
これは、Fn()が初めて呼び出された場合、var fn変数がグローバルオブジェクトのプロパティとして存在せず、fnによって参照される匿名関数コンテキストが初期化されないため、コールがその前に失敗したことを示しています。
コードコピーは次のとおりです。
//最初に前の通話ロジックにコメントしてから、コンソール出力を見てください
// console.log( '呼び出しが始まる前...');
// fn();
// console.log( '前の呼び出しが終了...');
var fn = function(){
console.log( 'fn function [expression]宣言実行...')
//コード..
}
console.log( 'その後に呼び出しが始まります...');
fn(); //式の後に呼び出されます
console.log( 'その後に呼び出しが始まります...');
コンソール印刷結果:
その後、式関数を呼び出すことは問題ないことがわかります。理由を要約しましょうか?
要約:
1:まず第一に、変数自体は関数として存在しませんが、匿名関数への参照(値タイプは参照に属していません)
2:コード実行段階では、グローバルコンテキストを初期化するとき、それはグローバル属性として存在しないため、可変オブジェクトの汚染を引き起こしません。
3:このタイプの宣言は、一般的にプラグインの開発で一般的であり、閉鎖のコールバック関数への呼び出しとしても使用できます。
したがって、function fn(){}はvar fn = function(){}に等しくなく、本質的な違いがあります。