Javascript window.variable can';无法访问

Javascript window.variable can';无法访问,javascript,Javascript,我正在尝试制作一个网站,其中有一个id为“vid”的文本“game over”,我希望它每300-400毫秒随机排列大小写,并在重置回小写之前保持40毫秒不变。 这是我现在得到的代码:(我的Javascript不是很好) setInterval(函数(){ window.smth=Math.floor((Math.random()*100)+1)+300; var elem=document.getElementById('vid'); elem.textContent=“游戏结束”; set

我正在尝试制作一个网站,其中有一个id为“vid”的文本“game over”,我希望它每300-400毫秒随机排列大小写,并在重置回小写之前保持40毫秒不变。 这是我现在得到的代码:(我的Javascript不是很好)

setInterval(函数(){
window.smth=Math.floor((Math.random()*100)+1)+300;
var elem=document.getElementById('vid');
elem.textContent=“游戏结束”;
setTimeout(函数(){
elem.textContent=elem.textContent.split(“”).map(函数(v){
var chance=Math.round(Math.random());
return v=chance?v.toUpperCase():v.toLowerCase();
}).加入(“”);
},window.smth);
},window.smth+40)

因为在回调中设置了
window.smth
,所以在设置间隔时它是
未定义的。即使在第一次调用回调后定义了
smth
,它仍然不起作用,因为
setInterval
函数只调用一次

创建这样的间隔的方法是多次超时;伪代码:

setTimeout(=>{
//做点什么
setTimeout(…,otherTime)//您不想嵌套并嵌套它,只需为此创建一个递归函数即可
},时间)

您在第一次超时回调中声明了
window.smith
,但在实际调用回调之前使用了它。 所以最后一行的
window.smith
在当时实际上仍然是
未定义的

尝试将
window.smth
定义移出第一个回调,如下所示:

window.smth = Math.floor((Math.random() * 100) + 1) + 300;
setInterval(function() {
  var elem = document.getElementById('vid');
  elem.textContent = "game over";
  setTimeout(function() {
    elem.textContent = elem.textContent.split('').map(function(v) {
      var chance = Math.round(Math.random());
      return v = chance ? v.toUpperCase() : v.toLowerCase();
    }).join('');
  }, window.smth);
}, window.smth + 40);

smth
setInterval()
放入另一个:

var-smth=500;
setInterval(function(){smth=Math.floor((Math.random()*100)+1)+300;},250);
setInterval(函数(){
var elem=document.getElementById('vid');
elem.textContent=“游戏结束”;
setTimeout(函数(){
elem.textContent=elem.textContent.split(“”).map(函数(v){
var chance=Math.round(Math.random());
return v=chance?v.toUpperCase():v.toLowerCase();
}).加入(“”);
},smth);
},smth)

不要将
窗口
对象用作全局变量保持器。只要在你希望你的时间间隔运行的时候,在时间间隔之外,分配一个变量就可以了。这里的问题到底是什么?为什么你认为
window.smth
被忽略了?这意味着
window.smth
总是一样的。如果你嵌套、嵌套、再嵌套,你不会做无限次,你需要使用
setInterval()
不,那不是真的。我在评论中所说的;您必须为此创建一个函数并递归调用它