JSの関数宣言と関数式の違い


同じ点
注:関数宣言と関数式の同じ点は以下の点に限定されません.
  • 関数は1つの値ですので、他の値と同様に、関数は出力されたり、割り当てられたり、パラメータとして他の関数に伝えられたりすることもできます.関数はどのように定義されていても、もちろん他の値の出力とは違います.まずこの値を出力します.
    function nameAlert(name){
        alert('      :' + name + ' 。');
    }
    alert(nameAlert);
              1,            ,      :function nameAlert(name){
        alert('      :' + name + ' 。');
    }
  • はパラメータとして他の関数に伝えられます.
    function nameAlert(name){
        alert('      :' + name + ' 。');
    }var anotherNameAlert=nameAlert;
    anotherNameAlert('myvin');
    この例では、関数nameAlertをパラメータとしてanotherNameAlertに伝達し、anotherNameAlertも関数を指している.ここでは関数の伝達に関して、関数の伝達は参照を伝えること、すなわち関数がメモリ内にある位置、nameAlertおよびanotherNameAlertはいずれも関数の一つの参照であり、関数名nameAlertanotherNameAlertに与えたとき、それらは同じ函数で参照される.anotherNameAlertの出力結果は
          :myvin 。
  • です.
    もちろん関数には他の特徴があります.ここでは紹介しません.興味のあるものは自分でまとめられます.
    違い点
    注:関数宣言と関数表現の違いは、以下の点に限定されません.
    相対関数宣言と関数表現の間の同じ点は、それらの異なる点に注目すべきである.次に私は自分の理解を結び付けて話します.
  • 関数宣言には識別子が必要であり、すなわち、通常の関数名が必要である.関数式は関数名を省略できます.それらの定義については、友達はみんな知っているはずです.簡単に繰り返します.関数宣言(識別子付き)
    function functionName(arg1, arg2, ...){    }
    関数式
  • は、識別子を省略します.
    var  variable=function(arg1, arg2, ...){        }
  • は識別子を持っています.
    var  variable=function functionName(arg1, arg2, ...){        }
  • 関数宣言は、事前に関数宣言が実行されます.すなわち、関数宣言はブラウザがコードを実行しようとするときに実行されます.関数宣言は前の実行期間に実行されますので、実行期間になると関数宣言はもう実行されません.例の話はやはり前の文の真実の関数を言います:sayTruth();機能 sayTruth(){    alert('myvin) is handsome.');sayTruth();var sayTruth=function(){    alert('myvin) is 関数宣言なら、sayTruth()は事前に呼び出すことができます.関数宣言の前には大きな違いがあります.これを理解することは私たちの関数の応用に大きな助けになります.エラーを避けることができます.ECMAScript仕様では、関数ステートメント文は、グローバルコードまたは他の関数に組み込まれてもよいが、ループ、条件判定、またはtry/finallyおよびwith文には現れないと述べている.これについては、「上記ではifサイクルに登場する関数宣言があるのではないか」と疑問があるかもしれません.確かにそうですが、規定によって発行されました.守らないということは別です.JavaScriptはこの仕様の実現に対して厳格に守られていません.FFではifに関数声明が出ることができます.しかし、仕様がどうであれ、このような原因になるのはやはり関数声明のほうが先です.それとも上記の例と説明を引用しますか?sayTruth()  if(1){function} sayTruth(){alert('myvin} is handsome";else{function} sayTruth(){alert('myvin} is どうしてですか?もちろん早めに声明します.関数宣言が先行しているので、関数宣言はコード実行前に解析されます.実行順序はこのようになります.まずfunction sayTruth(){alert}を解析して、前の関数声明を上書きします.sayTruthを呼び出したら、コード実行中です.声明は無視されますので、自然にmyvin is uglyを出力します.関数式を作成することができます.(function(){alert('博主の名前は、myvinです. .'); })()これにより、大域変数は局所変数の影響を受けず、大域的に綺麗に保たれます.括弧の中には式があります.
    実際には、jsの解析器は関数宣言と関数表現に対して一視同仁的に扱われていません.関数声明に対しては、js解析器が優先的に読み取り、すべてのコードが実行される前に解析されたことを確認します.関数表現は、他の基本型の変数を定義するように、ある1つだけ実行しても解析されます.実際には、関数宣言の形式を使って関数を定義する場合、関数宣言の前に呼び出し文を書くことができますが、後者の場合はエラーが発生します.
    参照リンク:http://www.cnblogs.com/myvin/p/4649789.html
    http://blog.csdn.net/one_and_only4711/article/details/6361131