多次连续执行含setTimeout的代码段为何输出相同随机数?
问题原因及修复方案
你的代码多次运行后输出相同随机数的核心问题是全局变量覆盖:
- 用
var声明的t属于全局作用域,每次快速运行这段代码时,新生成的随机数会直接覆盖之前的t值。 setTimeout是异步执行的,当回调函数触发时,它读取的是全局作用域里最新的t值,因此所有异步回调最终都会打印最后一次生成的随机数。
修复方案
使用块级作用域变量(推荐)
把var换成let,let会创建块级作用域,每次运行代码时t都是独立的局部变量,不会被后续运行的代码覆盖:function generateRandomNumber(min, max) { return Math.floor(Math.random() * (max - min + 1) + min); } let t = generateRandomNumber(5000, 10000); setTimeout(function() { console.log("RandomNumber" + " " + t); }, t);封装成自执行函数
通过自执行函数创建独立的函数作用域,避免全局变量污染:(function() { function generateRandomNumber(min, max) { return Math.floor(Math.random() * (max - min + 1) + min); } var t = generateRandomNumber(5000, 10000); setTimeout(function() { console.log("RandomNumber" + " " + t); }, t); })();在回调内捕获随机数(适合无需统一延迟时间和打印值的场景)
如果允许延迟时间和打印的随机数是两个独立值,也可以直接在回调内生成并打印:function generateRandomNumber(min, max) { return Math.floor(Math.random() * (max - min + 1) + min); } setTimeout(function() { var t = generateRandomNumber(5000, 10000); console.log("RandomNumber" + " " + t); }, generateRandomNumber(5000, 10000));
内容的提问来源于stack exchange,提问作者Jeffrey
相关产品推荐
相关产品推荐

