奇怪的 for 循环问题 在 Nodejs 中
奇怪的 for 循环问题 在 Nodejs 中
代码如下,每次运行后items
中只有i=100
时的情况
var express = require('express');
var cheerio = require('cheerio');
var superagent = require('superagent');
var items = [];
var app = express();
for(var i=1;i<100;i++) {
app.get('/', function (req, res, next) {
superagent.get('http://xxx/' + i + '.html')
.end(function (err, sres) {
if (err) {
return next(err);
}
var $ = cheerio.load(sres.text);
items.push($('.d1').attr('href'));
res.send(items);
});
});
}
app.listen(3000, function () {
console.log('app is listening at port 3000');
});
这是闭包教程的经典例子😂
另外你这个逻辑似乎有点问题,回去重新写一下。
这个和闭包无关,你这里相当于创建了 100 个 app.get(’/’, fn)的路由处理, url 都一样的,估计是最后一个才起效。
这里都不用 express ,你直接用 superagent 不就行了。
没点进来就知道是这样😂
因为你里面的 function 实际是在 for 循环结束之后执行的,那时候 i 已经改变了
for (var i …) {
function(i) {
…
}(i);
}
试一下这样,把 i 作为参数传进去,可以避免受外部的 for 影响
给你一个改过的例子,用了一些略带花哨的 ES6 特性。要抓的东西你自己改一下吧。
https://gist.github.com/bdbai/3c4d1507c47874efe002683465a7bc25
你这第一句话全说错了。
看了标题就想到了结果,果然是这样 😂
还是闭包的问题啊。
是你的逻辑有点怪。
创建了 100 个路由处理,还是同一个路由。
那肯定只有一个结果了。
猜猜,果然就是闭包和异步引用的问题。
这种基础的 JS 面试常见知识点在 V2 论坛都快成月经贴了
for 写错位置了。。。。
看见标题,想到结果系列。
涉及到的知识点:
* var 的特性
* 块级作用域
* 作用域链
在 Node.js 中遇到奇怪的 for
循环问题,通常可能涉及到几个常见的陷阱或误解。下面我将列举几个常见的问题以及如何解决它们,同时附上代码示例。
1. 异步代码在循环中未正确处理
在 for
循环中使用异步函数(如 setTimeout
或数据库查询)时,如果未正确处理异步逻辑,可能会导致意外的行为。
// 错误示例
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1000);
}
// 输出:3 3 3
// 正确示例
for (let i = 0; i < 3; i++) {
(function(j) {
setTimeout(() => console.log(j), 1000);
})(i);
}
// 输出:0 1 2
2. 变量作用域问题
在 ES5 及更早版本中,使用 var
声明的变量具有函数作用域或全局作用域,这可能导致在 for
循环中变量被意外修改。
// 错误示例(使用 var)
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1000);
}
// 输出:3 3 3
// 正确示例(使用 let)
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1000);
}
// 输出:0 1 2
确保你使用的是 let
而不是 var
来声明循环变量,除非你有特定的理由需要使用 var
。如果问题仍然存在,请检查是否有其他逻辑错误或代码结构问题。