0

私はJavaScriptの初心者で、「JavaScriptの良い部分」を読み終えたところです。今、私はJavaScriptのクロージャとコールバックを理解してわかりやすくしようとしています。以下は、1から10までの数字を生成するはずだと私が想定しているコードです。しかし、コードはコンパイルに失敗します(私はノードbtwを使用しています)。

var someAsyncFn = function() {};
for (var i = 0; i < 10; i++) {
    (function(j) {
        someAsycFn(function() {
            console.log(j);
        });
    })(i);
}

エラーログは次のとおりです。

        someAsycFn(function() {
        ^
ReferenceError: someAsycFn is not defined
4

1 に答える 1

2

スペルミスがありました:

var someAsyncFn = function() {};
someAsycFn(function() {

関数を呼び出すと、文字が省略されnます。


まったく機能しない理由は、これが実際のコードではないためです。例です。someAsyncfn実際の関数ではありません。何もしません。var someAsyncFn = function() {};何もしない関数を作成します。これは、実際の非同期関数があった場合に何が起こるかを説明するためのプレースホルダーです。

このようなものは、Webブラウザーでの効果を示します(node.jsで別の非同期関数を使用する必要があります。コードをクリーンに保つためにjQueryを使用しています)。

var someAsyncFn = function(successfn) {
    $.get(document.location, successfn); // make an AJAX request to the current URL, for demonstration purposes
                                         // successfn will be called when the request succeeds
};
for (var i = 0; i < 10; i++) {
    (function(j) {
        someAsyncFn(function() {
            console.log(j);
        });
    })(i);
}

これが機能するのは、(a)を含む関数がconsole.log実際に呼び出され、(b)$.get要求が完了すると、非同期で呼び出されるためです。

これの全体的なポイントは、コードが非同期で実行されることです。つまり、順番に到達0することはできません。9リクエストが完了した順序でそれらを取得します。私にとって、これは次のとおりです。

2
3
1
0
4
5
6
7
8
9

おそらく異なる結果が得られます。

于 2013-02-03T18:07:21.190 に答える