2

このJavaScriptコードに出くわしました。

var digit_name = function() {
    var names = ['zero', 'one','two'];
    return function(n) {
        return names[n];
    };
}();

alert(digit_name(1));

出力は1です。内部関数が変数digit_nameに割り当てられていることを理解しています。外部関数のコードの後の6行目に括弧を追加する必要は何ですか。誰が正確に何が起こっているのかを知ることができますか?

4

6 に答える 6

9

括弧を追加すると、外側の関数が実行されます。これを省略すると、外側の関数がdigit_name内側の関数の代わりに割り当てられます。

于 2012-08-28T18:54:46.010 に答える
4

()あなたが見るエンディングは、その外側の関数をすぐに実行させます。したがってdigit_name、外部関数へのポインターではなく、結果の内部関数を格納することになります。

詳細については、次を参照してください: javascript の自己実行関数の目的は何ですか?

于 2012-08-28T18:54:58.243 に答える
1

何が起こっているのかをよりよく理解するために、これらの関数にいくつかの名前を付けましょう。

var digit_name = function outer() {
    var names = ['zero', 'one','two'];
    return function inner(n) {
        return names[n];
    };
}();

alert(digit_name(1));

したがって、ここでは と の 2 つの関数が使用されinnerますouter。という関数を定義しています。outerその目的は、names配列をキャプチャするクロージャ スコープを作成し、このクロージャにアクセスできる別の関数を定義して返すことです。6 行目の括弧は関数の呼び出しをdigit_names意味するため、変数に割り当てられる値は外側の関数ではなく、内側の関数です。

于 2012-08-28T18:57:42.463 に答える
1

var digit_name = function() {...}; =>digit_nameは関数です

var digit_name = function() {...}();=>digit_nameは関数によって返されるオブジェクトです

于 2012-08-28T18:58:32.243 に答える
0
var digit_name = function() { // Create outer function
    var names = ['zero', 'one','two']; // Define names array, this is done when the outer function is ran
    return function(n) { // Return the new inner function, which gets assigned to digit_name
        return names[n];
    };
}(); // Execute the outer function once, so that the return value (the inner function) gets assigned to digit_name
于 2012-08-28T18:57:07.647 に答える
0

ここには 2 つの非常に迅速なプロセスがあります。

これを書くとしたら:

function makeDigitReader () { var names; return function (n) { return names[n]; }; }
var myDigitReader = makeDigitReader();

myDigitReader に内部関数が与えられると正しく推測できます。

彼らがやっていることは、ステップをスキップすることです。括弧を追加することで、定義された瞬間に関数を起動しています。

だから、あなたはこれが起こっています:

var myDigitReader = function () {
    var names = [...];
    return function (n) { return names[n]; };
};

myDigitReader = myDigitReader();

何が起こったのですか?内側の関数を、以前は外側の関数だったものへの新しい値として返しました。したがって、外側の関数はもう存在しませんが、内側の関数は引き続きnames配列にアクセスできます。

関数の代わりにオブジェクトを返すこともできます。また、これらのオブジェクトのプロパティ/関数は、最初に関数の内部にあったものにもアクセスできます。

通常、これらの即時呼び出し関数は括弧で囲まれていますvar myClosure = (function() { return {}; }());

戻り値を値に代入せずに実行する場合は、コンパイラに評価させるために、括弧で囲むか、その前にある種のオペランドを追加する必要があります。

!function () { doStuffImmediately(); }(); // does stuff right away
function () { doStuffImmediately(); }(); // ***ERROR*** it's an unnamed function

あなたが持つかもしれないすべての質問に答えることを願っています.

于 2012-08-28T19:04:33.790 に答える