web-dev-qa-db-ja.com

関数ではなくvarとしての関数宣言

ますます関数が次のように宣言されているのを見ています

var foo = function() {

    // things
};

私が学んだ方法の代わりに、

function foo() {

    // things
}

違いは何ですか?よりよい性能?範囲?この方法を使用する必要がありますか?

28
Steve Robbins

var foo = function() {}は、無名関数を参照する変数を定義します。

function foo() {}は、名前付き関数fooを定義します。

どちらも関数パラメーターとして名前で渡すことができ、使用目的がOOPの場合はどちらでもインスタンス化できます。

結局のところ、どちらを使用するかは、主に特定のユースケースによって決まります(JavaScriptはそのように楽しいです;))。最終的に前者を使用する場合、私はstrongly関数に名前を付けることをお勧めします。

var foo = function MY_function() {}。この命名規則は、デバッガの呼び出しスタックが役に立たないことを防ぎます。

25
Demian Brecht

関数式:

_//someFunction(); //wouldn't work when uncommented
var someFunction = function(){ alert('yay'); };
_

この場合のfunc式は匿名ですが、参照用にvarに割り当てられています。これは、次の点でラベル付き関数ステートメントとは異なります。

  • 巻き上げることはできません(定義される前に呼び出されます)
  • new someFunction().constructor.name === 'someFunction';//falseインスタンスは、constructor.nameのvar名を取得しません。関数への参照はvarに割り当てられていますが、関数ではなくvarがvar名に関連付けられているためです

ラベル付けされた関数ステートメントでは:

_//someFunction(); //works when uncommented
function someFunction(){ alert('yay'); }
_
  • 巻き上げ作業
  • new someFunction().constructor.name === 'someFunction'; //true名前は関数に直接関連付けられています。

一般的に言えば、物事が移動したり、メソッドを1行で定義/割り当てたりしている場合に呼び出しを失敗させたい場合を除き、varに式を実行する大きな理由は実際にはありません。オブジェクトの実際の動作に到達し、1行のパブリックメソッド定義を実行できるように、下部に内部funcとメソッド定義があるオブジェクトを整理するためにホイストが実際に役立つと思います(同じようにfuncsを_this._に割り当てるだけで)名前)参照しやすいように、すべて1か所にまとめています。コンストラクター、IMOには常にラベル付きステートメントを使用するようにしてください。これにより、コンストラクターを介してオブジェクトの「タイプ」を識別できます。

13
Erik Reppen

最初の例はですが、2番目の例はステートメントです。関数を式として定義すると、定義が発生する場所、それに割り当てることができるもの、パラメーターとして渡すことができるなど、より柔軟に対応できます。

例えば:

SomeThing('abc', function(a,b) {return a*b;});

対...

function tmp(a,b) { 
    return a*b;
}

SomeThing('abc', tmp);

より複雑な例では、関数式の構文がないとわいせつに複雑になります。

見てください https://stackoverflow.com/questions/111102/how-do-javascript-closures-work

8
gahooa

主な実用的な違いは巻き上げです。例えば:

foo(); // alerts 'hello'
function foo() {alert('hello');}

foo(); // throws an error since foo is undefined
var foo = function() {alert('hello');}

また、これは未定義の動作です

function foo(){
  if (true) {
    function bar(){}
  }
  bar();
}

これは大丈夫です。

function foo(){
  if (true) {
    var bar = function(){}
  }
  bar();
}
4
Austin