14

JavaScript には、オブジェクト リテラルと関数リテラルの両方があります。

オブジェクトリテラル:

myObject = {myprop:"myValue"}

関数リテラル:

myFunction = function() {
   alert("hello world");
}

リテラルという言葉の意味は何ですか?Java にはメソッド リテラルがあると言えますか?

public void myMethod() {
    System.out.println("are my literal");
}
4

6 に答える 6

9

最大の違いは、いつどのように解析して使用するかです。あなたの例を挙げてください。

myFunction = function() {
   alert("hello world");
}

myFunction()無名関数で変数を宣言するため、コードがそこに到達した後にのみ実行できます。

それ以外の使い方をすると、

function myFunction(){
   alert("hello world");
}

この関数はコンパイル時に宣言され、スコープ内でいつでも使用できます。

この質問も参照してください。

于 2012-09-07T09:11:20.743 に答える
8

アドオン:

JavaScript の関数リテラルは、関数式の同義語です。

関数式と同様に、関数リテラルはオプションの識別子 (名前) を持つことができます。

したがって、関数式/関数リテラルと言う場合、識別子のない関数式/関数リテラル (無名関数とも呼ばれます) だけでなく、識別子付きの関数式/関数リテラルも含まれます。多くの本では、関数式/関数リテラルは、識別子のない関数式/関数リテラル (無名関数) の同義語として使用されています。

関数リテラル

関数オブジェクトは、関数リテラルで作成されます。

// add という変数を作成し、 // 2 つの数値を加算する関数を格納します。

> var add = function (a, b) {
>     return a + b; }; 

関数リテラルには 4 つの部分があります。

最初の部分は予約語関数です。

オプションの 2 番目の部分は、関数の名前です。この関数は、その名前を使用して自分自身を再帰的に呼び出すことができます。この名前は、関数を識別するためにデバッガーや開発ツールで使用することもできます。前の例に示すように、関数に名前が付けられていない場合、それは匿名であると言われます。

3 番目の部分は、括弧で囲まれた関数のパラメーターのセットです。括弧内は、コンマで区切られた 0 個以上のパラメーター名のセットです。これらの名前は、関数内で変数として定義されます。通常の変数とは異なり、未定義に初期化されるのではなく、関数が呼び出されたときに指定された引数に初期化されます。

4 番目の部分は、中かっこで囲まれた一連のステートメントです。これらのステートメントは、関数の本体です。これらは、関数が呼び出されたときに実行されます。

関数リテラルは、式が出現できる場所ならどこにでも出現できます...

ソース: JavaScript: 良い部分- Douglas Crockford

つまり、次のことを意味します。

myFunction = function () {
   alert("hello world");
};

関数式/関数リテラルですが、次のこともできます。

myFunction = function myFunction() {
   alert("hello world");
};

関数式/関数リテラルです。

于 2016-10-02T20:19:52.900 に答える
7

JavaScriptとJavaを比較しないでください。クマやクジラと同じくらいの共通点があります。Javaはオブジェクト指向プログラミング言語ですが、JavaScriptは関数型プログラミング言語です。

関数型言語には、ファーストクラスオブジェクトとしての関数の概念があります。関数は変数に割り当てることができ、他の関数の戻り値になる可能性があるため、引数として渡すことができます。

オブジェクトリテラルは、オンザフライでインラインで作成するオブジェクトです。同じことが関数リテラルにも当てはまります。しかし、あなたが与えている例は、実際には通常の関数宣言に似ています。

function foo()
{
    alert('bar');
}

スコープの一番上に移動され、次のように変換されます。

var foo = function()
{
    alert('bar');
};

関数を引数/戻り値として渡すことができる場合は、理にかなっています。

var processed = (function(someFunc)//<-- argument name
{
    return function()
    {
        alert('I\'ll call some function in 2 seconds, get ready');
        setTimeout(someFunc,2000);//<-- passes a reference to foo, as an argument to setTimeout
    }
})(foo);//pass reference to function object foo here

これは、JSをJavaのサブセットとして扱うのをやめれば、JSでできるあらゆる種類のことの始まりにすぎません。

于 2012-09-07T09:13:38.930 に答える
4

関数リテラルは、名前のない関数を定義する単なる式です。

関数リテラルの構文は、ステートメントとしてではなく式として使用され、関数名が不要であることを除いて、関数ステートメントの構文とよく似ています。

したがって、メソッド名を指定すると、メソッドリテラルにすることはできません。

于 2012-09-07T09:03:56.397 に答える
1

ECMA-262 には正式な定義はありません。

しかし、ウィキペディアや私が学んだ他の多くの PL によると、リテラルは値の表現です

つまり、次のことを意味します。

function() {alert("hello world")}

はリテラルですが、次のとおりです。

function hello_world() {alert("hello world")}

ではありません。後者は値だけでなく参照も表すためです。

私はvsenolの答えに賛成票を投じましたが、今では間違っていると思います。

于 2018-07-22T00:21:35.490 に答える