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

时间:2017-11-02 05:23:47

标签: javascript web-deployment

嘿伙计,所以我只是想在javascript中使用和不使用var来理解变量的范围,我到目前为止理解如果声明一个变量没有var,那么在javascript中它会在范围内上升,直到它找到对该变量,如果它到达全局范围,那么它将在那里创建变量。

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

在我的头脑中,首先发现声明为0并且因为它没有用var声明它现在将是一个全局变量,因为当它上升范围时它不会被找到。目前发现是0。

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

然后,在获得当前位置时,当它发现= 1时,它会不会超出范围,直到它看到在getMyLocation函数中找到回调函数之外并将其重新分配为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>

2 个答案:

答案 0 :(得分:0)

请参阅,Js是单线程的。因此,它通过事件循环(video which explains what is event loop)将任务管理为异步。你正在为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>

答案 1 :(得分:0)

以下是发生情况的细分:

  • 第一个console.log()按原样打印“found”的值。印刷品:0

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

  • 我们到达第三个console.log()语句,它将打印仍然为0的“found”值(前一阶段没有响应)。印刷品:0

  • 异步调用从第2阶段解析,并将“found”的值更新为1,然后将其打印出来。印刷品:1

因此,总输出为0 0 1

PS:在没有声明变量的情况下使用变量通常被认为是一个坏主意,如果页面顶部存在“use strict”,则无法使用变量。