Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有jQuery和javascript的变量范围_Javascript_Jquery - Fatal编程技术网

带有jQuery和javascript的变量范围

带有jQuery和javascript的变量范围,javascript,jquery,Javascript,Jquery,因此,我编写了以下函数: function getData() { var data; $(function () { $.getJSON('https://ipinfo.io', function (ipinfo) { data = ipinfo; console.log(data); }) }) console.log(data); } 上面的问题是第二个console.log没有在jQuery中保留分配的

因此,我编写了以下函数:

function getData() {

   var data;
   $(function () {
      $.getJSON('https://ipinfo.io', function (ipinfo) {
          data = ipinfo;
          console.log(data);
     })
   })

console.log(data);
}

上面的问题是第二个console.log没有在jQuery中保留分配的信息,而是记录了一个未定义的对象。我不确定到底出了什么问题,但我认为这是一个相当小的问题。然而,尽管我在网上搜索了很多,我仍然没有找到这个问题的答案。

有一行:Javascript是异步的。

虽然许多人很难弄清楚它到底意味着什么,但一个简单的例子可能可以解释这一点

  • 您可以从URL请求一些数据
  • 当接收到来自第二个URL的数据时,您希望使用接收到的数据设置一个变量
  • 您希望在请求函数的回调之外使用它(在发出请求之后)
  • 对于传统程序员来说,很难理解JavaScript的执行顺序不是1,2,然后是3,而是1,3,2

    之所以会发生这种情况,是因为Javascript的事件循环机制,其中每个异步操作都与一个事件绑定,并且只有在事件发生时才调用回调。同时,回调函数外部的代码执行时不会保留事件实际发生的时间

    就你而言:

    var data;
    $(function () {
       $.getJSON('https://ipinfo.io', function (ipinfo) {//async  function's callback
          data = ipinfo;
          console.log(data);//first console output
      })
    })
    
    console.log(data);//second console output
    
    当从
    $.getJSON
    函数接收到数据时,异步函数的回调被执行,javascript将继续执行,而无需等待
    回调
    将值分配给
    数据
    变量,从而使您在控制台中记录
    未定义
    (这是调用
    console.log
    data
    变量的值


    我希望我能解释一下。!

    .jQuery.getJSON()
    异步返回结果。您可以使用
    .then()
    async/wait
    在jQuery承诺对象完成后通过代码使用
    数据
    。可能的重复不是范围问题,而是操作顺序问题。由于异步性和顺序的性质,第二个
    控制台.log
    在第一个之前执行。