我是一名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
答案 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
请求完成时异步调用它。
这一点的全部意义在于代码以异步方式运行,这意味着您不会按顺序获得0
到9
;你会按照请求完成的顺序得到它们。对我来说,这是:
2
3
1
0
4
5
6
7
8
9
您可能会得到不同的结果。