【问题标题】:Reassignment of variables not declared with var within a callback function在回调函数中重新分配未使用 var 声明的变量
【发布时间】:2017-11-02 05:23:46
【问题描述】:

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

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

在我的脑海中 first found 被声明为 0 并且由于它没有用 var 声明它现在将是一个全局变量,因为随着它的作用域上升,它不会被找到。目前找到的是 0。

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

然后,当它说 found = 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>

【问题讨论】:

  • 在没有 var(或 letconst)的情况下初始化变量是 not 声明它。 ;-)
  • 传递给navigator.geolocation.getCurrentPosition()的函数异步返回结果
  • @guest271314 但是为什么在该函数中找到的console.log 不是 1 的回调函数在该函数中设置为 1?
  • 正如 guest271314 所说,第一个 console.log 打印 0,然后对 getCurrentPosition 的调用异步停止,脚本继续,最后一次调用 console.log 发生 found 仍然为 0。然后一段时间后,回调被调用,found 设置为 1 并执行对 console.log 的中间调用。所以日志显示0 0 1

标签: javascript web-deployment


【解决方案1】:

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

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

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

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

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

所以,总输出为 0 0 1

PS:在不声明变量的情况下使用变量通常被认为是一个坏主意,如果页面顶部出现“use strict”,则将无法正常工作。

【讨论】:

    【解决方案2】:

    看,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>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-10
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      相关资源
      最近更新 更多