【问题标题】:Understanding Callbacks and Closure in javascript了解 javascript 中的回调和闭包
【发布时间】:2013-01-18 11:44:33
【问题描述】:

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

【问题讨论】:

  • 请注意,缺少'n'的错误已被删除。但是我无法打印从 1 到 10 的数字。

标签: javascript node.js callback closures


【解决方案1】:

你犯了一个拼写错误:

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

您对函数的调用省略了字母n。


它根本不起作用的原因是这不是真正的代码。这是一个例子。 someAsyncfn 不是真正的函数。它什么也不做。 var someAsyncFn = function() {}; 创建一个什么都不做的函数。它是一个占位符,用于描述如果有一个真正的异步函数会发生什么。

这样的东西会在网络浏览器中显示效果(您需要在 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

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

【讨论】:

  • @lonesomeday,你有代码的工作示例(jQuery 或 node.js)来更好地解释你的答案吗?
猜你喜欢
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 2015-05-22
  • 2019-08-20
  • 2013-01-23
  • 1970-01-01
  • 2012-04-04
  • 2015-07-02
相关资源
最近更新 更多