【新手求解答】node.js的使用中出现了问题,fs.rename竟然有这么大的威力吞噬掉了一个变量?
作为一个新手,最近在看《node.js实战》这本书,书中有一段实现一个照片上传功能的例子,我自己也敲了下来,由于书年代久远,node.js的发展太快了,很多东西都与现在不同了,在实现多张图片上传的功能时使用了multer中间件( multer),然后使用fs.rename这个API调换文件的位置,然后奇怪的事情出现了。先上一段代码:
由于一直报错,我就挨个排查bug,最后锁定在fs.rename的这个部分,于是打印了两次files[i].filename,发现第一次没有问题,第二次报错,不明白这是怎么回事?作用域吗? 最后的解决办法是用一个参数把files[i].filename保存起来,就OK了!
然而我还是不明白为什么,求大神解答一下!不胜感激!
16 回复
@gjc9620 写了个简单的demo,代码: 你的预期是这样的: 实际它是这样的
有种东西叫变量提升,即,用var定义的变量会在这块作用域前先定义。 所以,以上的代码等同于:
又因为你的函数是异步的,所以在这里面取的 i 就是最前面这个全局的 i 。 不缓存的话,最简单的解决办法就是用 let 来处理。