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请求完成时异步调用的。

关键在于代码是异步运行的,这意味着您不会09顺序执行;您将按照请求完成的顺序获得它们。对我来说,这是:

2
3
1
0
4
5
6
7
8
9

你可能会得到不同的结果。

于 2013-02-03T18:07:21.190 回答