全球主机交流论坛

标题: 有偿寻求js大神【已解决】 [打印本页]

作者: qgx    时间: 2021-4-14 08:29
标题: 有偿寻求js大神【已解决】
本帖最后由 qgx 于 2021-4-14 13:09 编辑

js定义了一个 全局let i=0,当作数组下标,用来起始循环输出数组的值,i每次加1(i++),起始循环了几次突然出现i=NaN,导致打印出来数组的值为undefined,望大神解决,不白**。

i变量跟网页中的变量可能重名了,改了变量名问题解决,感谢大神们的提醒。
作者: website    时间: 2021-4-14 08:34
其实你问问题只要表明你要弄个什么什么东西,什么需求,没准能帮的上你,看你这描述,一会儿全局的i,一会儿循环里的i,循环里的i是要小于数组的长度的。
作者: wss    时间: 2021-4-14 08:39
用 var 不要用 let,let不是全局的。

var的作用域是会提升的,var声明的变量只能是全局的或者是整个函数块的。

let则允许声明一个作用域被限制在块级中的变量、语句或者表达式。
作者: shayne    时间: 2021-4-14 08:52
上代码
(, 下载次数: 0)
作者: qgx    时间: 2021-4-14 11:55
let i=0,msgs=[];
function main(){
        msgs=['123','456','789','abc'];
        setInterval(sendMsg,5000);

}
function sendMsg(){
        console.log("进入函数i的值等于"+i);
        if(i==msgs.length){
                i=0;
                发送消息语句...
                console.log(msgs[i] + "执行了if语句");
                i++;
        }else{
                发送消息语句...
                console.log(msgs[i] + "执行了else语句");
                i++;
        }
        console.log("函数执行完i的值等于"+i);

}
--------------------------------
就是很简单的代码,脚本嵌入网页执行,结果
--------------------------------
进入函数i的值等于0
123执行else语句
函数执行完i的值等于1
进入函数i的值等于1
456执行else语句
函数执行完i的值等于2
进入函数i的值等于2
789执行else语句
函数执行完i的值等于3
进入函数i的值等于3
abc执行else语句
函数执行完i的值等于4
进入函数i的值等于4
123执行if语句
函数执行完i的值等于1
进入函数i的值等于loop
undefined执行else语句
函数执行完i的值等于NaN
进入函数i的值等于NaN
undefined执行else语句
函数执行完i的值等于NaN
进入函数i的值等于NaN
undefined执行else语句
函数执行完i的值等于NaN
--------------------------------
使用var声明也是这个问题,有时可以完整循环完几次才出问题,有时一开始就出问题,各位老哥看看哪里的问题
作者: h20    时间: 2021-4-14 11:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: Gin_Node    时间: 2021-4-14 11:56
or 1 or
作者: kne    时间: 2021-4-14 11:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: qgx    时间: 2021-4-14 12:02
website 发表于 2021-4-14 08:34
其实你问问题只要表明你要弄个什么什么东西,什么需求,没准能帮的上你,看你这描述,一会儿全局的i,一会 ...

老哥,看看
作者: qgx    时间: 2021-4-14 12:14
kne 发表于 2021-4-14 11:59
跟你执行的网页有关系吧 我这一直正常循环

有没有解决办法,比如改代码?
作者: MjjKing    时间: 2021-4-14 12:48
本帖最后由 MjjKing 于 2021-4-14 12:50 编辑
  1. let i = 0;
  2. msgs = [];

  3. msgs = ['123', '456', '789', 'abc'];
  4. setInterval(sendMsg, 5000);

  5. function sendMsg() {
  6.         if (i == msgs.length) {
  7.                 i = 0;
  8.                 console.log(msgs[i] + "****TRUE****");
  9.         } else {
  10.                 console.log(msgs[i] + "****FLASE****");
  11.         }
  12.         i++;
  13. }
复制代码


我这里运行正常
作者: 纱雾    时间: 2021-4-14 12:53
本帖最后由 纱雾 于 2021-4-14 12:55 编辑

我在node环境和浏览器环境执行你的代码都没有问题。会不会是你发消息是同步发的一直等待io然后setInterval炸了
作者: micto    时间: 2021-4-14 12:54
  1. let msgIndex = 0
  2. let msgs = []

  3. main()

  4. function main() {
  5.   msgs = ['123', '456', '789', 'abc']

  6.   setInterval(sendMsg, 1000)
  7. }

  8. function sendMsg() {
  9.   console.log('msgIndex before', msgIndex)

  10.   if (msgIndex >= msgs.length) {
  11.     msgIndex = 0
  12.   }

  13.   // 开始执行发送消息逻辑
  14.   console.log("开始执行发送消息逻辑 =>", msgs[msgIndex])

  15.   msgIndex++

  16.   console.log('msgIndex after', msgIndex)
  17. }
复制代码

作者: cnly1987    时间: 2021-4-14 12:57
还是变量域的问题,
msg 定义是[]
你再main中修改,但是sendmsg中获取。你可能在命令行中可能能得到msg的修改值,但是 main函数没有返回 修改后的msg, 这里就可能出现错误。
作者: phpznr    时间: 2021-4-14 13:03
搜一下loop,你网页上的其他js执行了i='loop'之类的语句
作者: shayne    时间: 2021-4-14 13:18
搜下其他地方有没有重新给i赋值了
作者: qgx    时间: 2021-4-14 13:21
micto 发表于 2021-4-14 12:54

幸苦老哥了,我改变量名解决了,你的代码我再看看
作者: qgx    时间: 2021-4-14 13:30
phpznr 发表于 2021-4-14 13:03
搜一下loop,你网页上的其他js执行了i='loop'之类的语句

感谢




欢迎光临 全球主机交流论坛 (https://d.168530.xyz/) Powered by Discuz! X3.4