JavaScript作用域问题求助:随机句子生成函数二次调用失效
解决你的Lorem Ipsum生成器作用域问题
嘿,我太懂你这种卡壳的烦躁了——全局变量的坑真的容易让人头大,尤其是第一次调用正常,第二次直接拉胯的情况!咱们先拆解问题出在哪,再一步步修复。
问题根源:全局状态被污染了
你代码里的numWords和sentince都是全局变量,第一次调用genSentinces()的时候:
numWords从初始的随机数(比如5)被递减到0,第二次调用时while (numWords > 0)直接不执行;sentince原本是数组,第一次调用后被join(' ')改成了字符串,第二次调用sentince.push()的时候,字符串根本没有push方法,这甚至可能导致浏览器崩溃!
修复方案:把变量放到函数内部(局部作用域)
最稳妥的做法是把需要每次调用都重置的变量放到函数内部,这样每次调用genSentinces()都会创建全新的局部变量,不会和上一次调用的状态互相干扰。同时我还修复了一个小bug:原来的随机索引可能越界(数组索引是从0到length-1)。
修改后的完整代码:
var words = "The sky above the port was the color of television, tuned to a dead channel. All this happened, more or less. I had the story, bit by bit, from various people, and, as generally happens in such cases, each time it was a different story. It was a pleasure to burn."; var wordList = words.split(' '); var numSentences = getRandomInt(8, 40); // 修正了拼写错误~ var sentences = []; // 同样修正拼写 function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } function genSentence() { // 函数名改成单数更合理,因为每次生成一个句子 var numWords = getRandomInt(2, 8); // 移到函数内部,每次调用重新生成随机数 var sentence = []; // 局部变量,每次调用都新建数组 while (numWords > 0) { // 修复索引越界:wordList.length - 1 sentence.push(wordList[getRandomInt(0, wordList.length - 1)]); numWords--; } var result = sentence.join(' '); console.log(result); return result; } // 生成指定数量的句子 for (var i = 0; i < numSentences; i++) { sentences.push(genSentence()); } // 可以把所有句子拼接成段落 var paragraph = sentences.join('. ') + '.'; console.log(paragraph);
改动说明:
- 把
numWords和sentence(修正了拼写错误)移到genSentence函数内部,变成局部变量,每次调用函数都会重新初始化; - 修正了
getRandomInt的上限,避免数组索引越界; - 把函数名改成
genSentence(单数),更符合“生成单个句子”的逻辑; - 增加了循环生成指定数量句子的逻辑,利用你原本定义的
numSentences变量; - 最后可以把所有句子拼接成完整的段落,更贴近Lorem Ipsum的使用场景。
这样不管你调用多少次genSentence(),每次都是独立的,再也不会出现第二次调用失效的问题啦!
内容的提问来源于stack exchange,提问作者overl0rd
相关产品推荐
相关产品推荐

