我正在编写一个小的代码来记录来自回调的变量。到目前为止,我的代码看起来像这样。
function Run() {
GetNumber();
ShowNumber(); //--> (1)
}
Run();
var numero = null;
function GetNumber() {
numero = 12;
setTimeout(function() {
ShowNumber(); //--> (2)
}, 2000);
}
function ShowNumber() {
console.log(numero);
}
注意(1)和(2)。 调用(1)时,日志为预期的“ 12”。 但是当2秒钟后调用(2)时,它将不起作用并将其扔到控制台中:
null
我尝试将bind(this)添加到匿名回调中,但是仍然出现相同的错误。为什么会这样?
答案 0 :(得分:2)
此问题是声明变量的顺序。
//declare your variable before the run method, so that when the numero
//is changed inside the GetNumber method, it will change this variable
//declaring it after the run, makes it set it back to null after the run
//finishes.
var numero = null;
function Run() {
GetNumber();
ShowNumber(); //--> (1)
}
Run();
function GetNumber() {
numero = 12;
setTimeout(function() {
ShowNumber(); //--> (2)
}, 2000);
}
function ShowNumber() {
console.log(numero);
}
您也可以在Run();
之前声明它,它也可以正常工作。
答案 1 :(得分:1)
这里的问题是提升,变量被声明为全局变量。在一切都可以解决您的问题之前移动var。
您的代码在运行时基本上看起来像这样。
var numero = 12;
console.log(numero)
numero = null;
console.log(numero)
因此,当您像这样更改代码顺序时:
var numero = null;
function Run() {
GetNumber();
ShowNumber(); //--> (1)
}
Run();
function GetNumber() {
numero = 12;
setTimeout(function() {
ShowNumber(); //--> (2)
}, 2000);
}
function ShowNumber() {
console.log(numero);
}