变量显示未定义

时间:2017-07-01 16:51:03

标签: javascript node.js

我真的很无能,我用节点启动这个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);     
}

1 个答案:

答案 0 :(得分:2)

您的问题与variable hoisting有关,因为您在代码顶部调用startCrash,此时,变量currentCrashNumbercurrentCrashSpeed未初始化然而。发生这种情况是因为这些变量的声明被提升到代码的顶部,因此在调用函数时,它们首先是未定义的。

这是吊装后代码的行为:

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);   
}