3

重複の可能性:
2つの機能の違いは?(「functionx」と「varx = function」)
JavaScript:var functionName = function(){} vs function functionName(){}

var test = function() {
    var a = 20;
    var b = 30;

    return a + b;
};

function Add() {
    var a = 20;
    var b = 30;

    return a + b;
}

これら2つの機能の違いは何ですか?add()またはtest()を呼び出すと、どちらも同じ結果になります。正確には何をしvarますか?

4

6 に答える 6

3

関数宣言構文は、ブロックステートメント内では使用できません。

法的:

function a() {
    function b() {

    }
}

違法:

function a() {
    if (c) {
        function b() {

        }
    }
}

ただし、これは可能です。

function a() {
    var b;
    if (c) {
        b = function() {

        };
    }
}

私たちの間の言語オタクについては、仕様のセクション12.1、13.1、および14を参照することをお勧めします。次の構文の説明があります。

12.1ブロック

構文

ブロック:
    { StatementList opt }

StatementList:
    ステートメント
    StatementListステートメント

13関数の定義

構文

FunctionDeclaration:
    関数識別子 FormalParameterList opt ){ FunctionBody }

FunctionExpression:
    function Identifier opt FormalParameterList opt ){ FunctionBody }

FormalParameterList:
    識別子
    FormalParameterList 識別子

FunctionBody:
    SourceElements

14プログラム

構文

プログラム:
    SourceElements opt

SourceElements:
    SourceElement
    SourceElements SourceElement

SourceElement:
    ステートメント
    FunctionDeclaration

于 2012-04-03T23:05:05.060 に答える
1

それらは異なります。宣言の前にvarで宣言された関数を呼び出すと、まだ宣言されていないため、エラーがスローされます。

test(); // Undefined
var test = function() {
    ...
};

ただし、これはいつでも呼び出すことができ、実行時に定義できます。

test(); // OK
function test() {
    ...
};
于 2012-04-03T23:12:38.567 に答える
0

違いは、最初のケースでは名前に匿名関数が割り当てられており、2番目のケースでは関数宣言があることです。ほとんどの場合、この違いは重要ではありません。重要なのは

  1. デバッガーでは、名前付き関数をスタックトレースでより簡単に識別できる場合があります。
  2. 変数の巻き上げにより、関数宣言全体がそれを含む関数の先頭に「移動」されます。

    foo(1、2); var foo = function(a、b){return a + b; }

と同等です

var foo;
foo(1, 2);
foo = function (a, b) {
    return a+b;
}

(なぜ失敗するのかがわかります。)

于 2012-04-03T23:04:40.893 に答える
0

定義の前にAdd()を呼び出すことはできますが、定義の前にtest()を呼び出すことはできません。

var functionName = function(){} vs function functionName(){}も参照してください。

于 2012-04-03T23:10:20.173 に答える
0

var変数を無名関数に割り当てていることを意味します。関数を変数に割り当てる場合は、次のようにします。

var test = function Add() {
    var a = 20;
    var b = 30;

    return a + b;
};

使用している関数に名前を付ける必要があります。

関数を変数に割り当てる必要はありませんが、関数からのデータを保持したい場合は、関数を変数に割り当てる必要があるため、上記のコードを使用します。

于 2012-04-03T23:12:13.153 に答える
0

割り当てる最初の関数は、変数テスト変数への無名関数です。次に、変数testがtest()関数になります。

于 2012-04-03T23:13:12.197 に答える