回调函数中未使用var声明的变量的重新分配



嘿,伙计们,我只是想了解在javascript中使用和不使用var的变量的作用域,到目前为止,我知道如果一个变量在没有var的情况下声明,那么在javascript中,它将在作用域中上升,直到它找到对该变量的引用,如果它到达全局作用域,那么它将在那里创建变量。

我的问题是,在这段代码中,它的输出是0 0 1,但我不明白我的逻辑哪里出了问题。

在我的脑海中,第一个find被声明为0,由于它没有用var声明,所以它现在将是一个全局变量,因为随着它的范围扩大,它将不会被找到。当前找到的是0。

然后它将在第一个if语句之后打印。所以我们在0。

然后,在get current位置,当它说find=1时,它是否会上升范围,直到它在getMyLocation函数中看到find在回调函数之外,并将find重新分配给1?

然后我假设它现在会打印1,然后一旦它在代码块之外,再打印1,得到0 1 1。我明白我说的是错的,我只是不知道在哪里。

<script>
function getMyLocation() {
found = 0;
if (navigator.geolocation) {
console.log(found);
navigator.geolocation.getCurrentPosition(function(position) {
found = 1;
console.log(found);
});
}
console.log(found);
}
</script>

以下是正在发生的事情的分解:

  • 第一个console.log()按原样打印"find"的值。打印:0

  • 对navigator.geolocation.getCurrentPosition()的调用需要一个成功处理程序函数作为第一个参数。传递给它的函数将被异步调用,即,只要有响应。所以这里还没有印刷任何东西。

  • 我们进入第三个console.log()语句,它将打印"find"的值,该值仍然为0(上一阶段还没有响应)。打印:0

  • 异步调用从第2阶段解析,并将"find"的值更新为1,然后打印。打印:1

因此,总输出为0 0 1

附言:在不声明变量的情况下使用变量通常被认为是个坏主意,如果页面顶部出现"use strict",这将不起作用。

请参阅,Js是单线程的。因此,它通过事件循环(解释什么是事件循环的视频)将任务管理为异步。您正在为getCurrentPosition进行回调。所以,我想这是一个异步函数。它将在您的第三个控制台之后执行。所以,你对订单感到困惑。我澄清了你代码中的顺序。这样想有助于你了解这里发生了什么。这个问题与作用域无关。

<script>
function getMyLocation() {
found = 0;
if (navigator.geolocation) {
console.log(found); // order ::: 1
navigator.geolocation.getCurrentPosition(function(position) {
found = 1;
console.log(found); // order ::: 3
});
}
console.log(found); // order ::: 2
}
</script>

最新更新