理解javascript中的回调和关闭

时间:2013-02-03 18:04:52

标签: javascript node.js callback closures

我是一名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

1 个答案:

答案 0 :(得分: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

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