【问题标题】:Scope of variable in Javascript and JqueryJavascript 和 Jquery 中的变量范围
【发布时间】:2014-09-05 23:20:01
【问题描述】:

我遇到了困扰我的事情。我做的代码如下

var json='';
function displayThumbnails(list) {
    json = list;
    for(var i in list)
    {
        var image = $("<img class='item'>").attr("src", list[i].thumbnail);
        $("#showThumbnails").append(image);
    }  
}
alert(json);

我想问变量 json 也有一个作用域之外的函数,但是警报显示空白值。

console.log(json) 在函数内时显示结果。 json 的作用域在函数后没有结束,但警报显示空白值。为什么。?

根据公众需求:D

这是mainpage.php

<script>
  $(document).ready(function() {
      var jqxhr = $.get( "php/list.php",  function() {
      })

      .done(function(data) {
        var list = JSON.parse(data);
        console.log(list);
        displayThumbnails(list);

      })

      .fail(function() {
        alert( "Oh Snap, Server Error.!!! Try Again" );
        location.reload();
      });
  });
</script>

【问题讨论】:

  • 这个 JSON 是从哪里来的,ajax?
  • 因为警报在函数之外并且在函数被调用之前被调用。将警报放入函数中。
  • @ShaunakD - 你怎么知道,发布的代码中根本没有函数调用?
  • @adeneo 你看到了吗? displayThumbnails 未被调用。
  • @SpencerWieczorek - 不,我写了 "there's no function call .." 所以很明显我没有看到函数调用,但是 OP 写了 "When console.log(json) 是在函数里面显示结果",所以在某处被调用,但谁知道在哪里呢?

标签: javascript jquery json scope


【解决方案1】:

当到达alert(json)语句时,函数displayThumbnails还没有被调用,所以json的值仍然是''

【讨论】:

  • 如何解决这个问题。我还面临这样的问题,即进行 AJAX 调用,该调用运行 Async 并且依赖于它的其余脚本最终具有空值或空值。我读到这可以通过调用 async: false 来完成,这是一种不好的编码习惯。
  • 此外,它不应该像其他 HTML 和 js 文件那样在运行时遵循正确的从上到下的流程
  • 这只是一个函数声明,函数内部的任何代码都不会执行,直到从其他地方调用displayThumbnails
【解决方案2】:

您的变量可以通过函数声明内部和声明之后的代码访问。这里的问题,正如另一个答案中提到的那样,填充变量的代码尚未执行。

要确保使用变量的代码仅在变量填充后执行,您可以使用回调函数,类似于:

var json=''; 
// the second parameter should be a function
function displayThumbnails(list, callback) {
  var i, image;
  json = list; 
  for(i in list) { 
    image = $("<img class='item'>").attr("src", list[i].thumbnail);
    $("#showThumbnails").append(image);
  } 
  callback();
} 

doSomethingWithYourVariable = function() {
  alert(json);
};

// you can pass a callback function either by name, 
// then your call then should look similar to this:
displayThumbnails(list, doSomethingWithYourVariable);

// or pass an anonymous callback function:
displayThumbnails(list, function() {
  alert(json);
});

你也不应该在循环中声明一个变量,这会降低性能。


回调的简短说明:

您将另一个函数(也称为回调)传递给您的第一个函数调用。在第一个函数完成后,它将/应该在某个时候调用您的回调函数。通过这种方式,您可以获得控制权,我的意思是可以将代码插入到执行中。

在上面的示例中,使用回调并不是很有用,因为所有调用都是同步调用;但是回调在异步环境中提供了真正的价值,并且由于 AJAX 调用始终是异步的,因此它们主要用于那里。

jQuery.get('list.php', function(data) {
  // this already is an asynchronous callback function
  // that will be called when the request completes
});

// code here would be called immediately
// the request will most likely not be completed and no data available

更详细的介绍见Understanding callback functions in Javascript

【讨论】:

  • 嘿@Kevin Busse,我刚刚开始编码。我不知道回调();我可以在某处阅读此链调用吗?这个术语在 AJAX 中也经常使用。我想要一个文档来解释为什么这被称为回调以及如何在 ajax 之外使用它们。
  • 您可以使用它来执行调用链,或将控制权交还给已进行异步调用的位置。由于每个 AJAX 调用都是异步的,因此经常使用它。我会相应地更新我的答案。有关回调的一般介绍,请参阅:recurial.com/programming/…
猜你喜欢
  • 2011-05-26
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
相关资源
最近更新 更多