我真的很无能,我用节点启动这个javascript代码,然后我希望它只显示数字100和69,但这是第一次启动时的输出:
undefined undefined 100 69 100 69
。第一次变量显示为undefined ..我做错了什么?
此外,此代码仅用于测试目的..
startCrash();
var currentCrashNumber = 100;
var currentCrashSpeed = 100;
function startCrash(){
sendCrashNumber();
setInterval(function(){
if(currentCrashSpeed > 0){
currentCrashSpeed = currentCrashSpeed+-1;
}else{
clearInterval(this);
}
}, 1000);
}
var lijntjespeed = 69;
function sendCrashNumber() {
console.log(currentCrashNumber);
console.log(lijntjespeed);
io.sockets.emit('message', {
crashMultiplier: currentCrashNumber,
type: 'updateCrash'
});
setTimeout(sendCrashNumber, currentCrashSpeed);
}
答案 0 :(得分:2)
您的问题与variable hoisting
有关,因为您在代码顶部调用startCrash
,此时,变量currentCrashNumber
和currentCrashSpeed
未初始化然而。发生这种情况是因为这些变量的声明被提升到代码的顶部,因此在调用函数时,它们首先是未定义的。
这是吊装后代码的行为:
var currentCrashNumber; // undefined
var currentCrashSpeed; // undefined
var lijntjespeed; // undefined
startCrash();
currentCrashNumber = 100;
currentCrashSpeed = 100;
lijntjespeed = 69;
function startCrash(){
sendCrashNumber();
setInterval(function(){
if(currentCrashSpeed > 0){
currentCrashSpeed = currentCrashSpeed+-1;
}else{
clearInterval(this);
}
}, 1000);
}
...
向下移动startCrash
的调用,它将按预期工作。
jfriend00指出的代码中的另一个问题是来自clearInterval
函数的startCrash
调用。在您的代码中,this
作为参数传递,而它需要是时间处理程序。
要解决此问题,您可以将setInterval
(这是一个计时器)的返回值分配给变量并改为使用它:
function startCrash(){
sendCrashNumber();
var timer = setInterval(function(){
if(currentCrashSpeed > 0){
currentCrashSpeed = currentCrashSpeed+-1;
}else{
clearInterval(timer);
}
}, 1000);
}