【问题标题】:(js) Firebug debug causing code to work(js) Firebug 调试导致代码工作
【发布时间】:2011-04-20 16:57:54
【问题描述】:

请原谅尴尬的标题,我会尽力解释我的特殊问题。

我有三个 javascript 代码:

  • 一些自执行代码调用我的个人 Ajax 函数并将其传递给回调。
  • 检索数据的 ajax 函数本身调用回调,将数据传递给它。
  • 回调本身接收数据并将其解析为长度为 n 的数组。

需要注意的是,自执行代码和回调函数是在它们自己的闭包中定义的。 ajax 函数通过我定义为 $ 的导入命名闭包访问。

我对 JavaScript 还很陌生,我仍在学习闭包及其作用域。我有理由相信这个问题很可能与此有关。

不管怎样,我的问题与试图访问那个所谓的填充数组有关。由于我在合适的范围内(或者我相信)将数组定义为解析函数,所以我认为将项目推入其中应该没有问题。

这是自执行的:

(function ($){

    //Load stock
var items = [];
var response = $.Ajax("scripts/Lookup.php","GET",parse);

function parse(a){
    for(/*Simplified view*/){
        var item = new $.Item();
        item.name = domStuff.textContent;
        item.description = domStuff.textContent;
        item.price = domStuff.textContent;
        item.id = domStuff.textContent;

        items.push(item);
    }
}

    //Test the length (and verify contents)
    for(var i=0; i < items.length; i++){
        alert(items[i].price);
    }
}($));

这是我的定义,其中包括 Ajax 函数:

var $ = (function(){
var s = {};

    var ajax = function(url,method,callback){
        var a = new XMLHttpRequest();
        a.open(method, url, true);
        a.onreadystatechange = function(){
        if(this.readyState==4){
                callback(a);
            }
    }
    a.send();
    };

    s.Ajax = (function(){
        return ajax;
    }());

return s;
}());

所以标题的合理性在于,当我用 firebug 探测代码时,我可以看到 items 填充了 3 个由解析数据正确定义的对象。

然后循环按预期发出 3 次警报。

但是,如果我删除断点并让 firebug 忽略代码,则循环不会播放,我只能假设数组为空。

如果我在测试循环之前alert(items),代码也可以工作。

【问题讨论】:

  • 在哪里可以找到这个特殊版本的 Firebug?
  • 如果看起来像代码同步问题。当您使用 Firebug of Alert 时发生的唯一变量是延迟。似乎延迟为您的某些代码完成提供了喘息的时间。 (我还没有完全分析你的代码,但这是我想到的第一件事)。

标签: javascript scope firebug closures


【解决方案1】:

AJAX 正在填充项目asynchronously,这意味着在您的闭包中,第一次执行时 items.length 将为零(来自原始数组初始化)。随着时间的推移,AJAX 通过调用您的 parse 方法将填充此数组。

因为您将items 保留在一个闭包中,所以您实际上无法从外部访问它——这是一种很好的做法,但可能会导致调试问题!而不是items.push(item) 尝试alert(item)(任何浏览器,但执行阻塞)或console.log(item)(仅限firebug)来查看您确实是从AJAX 获取结果,而不是在初始执行中。

【讨论】:

  • 这也是我在回答中想要表达的。您的代码需要等待异步代码完成。
  • 谢谢,问题在于异步性。
【解决方案2】:

无论如何,我都不是 JavaScript 专家。但是,我在其他编程语言上遇到过调试已解决问题的情况。

在这些情况下,调试会减慢代码的运行速度。某些进程 A 需要异步进程 B 在执行超出某个点之前返回一个对象或执行某些操作。在这些类型的场景中最有可能发生的是主线程正在继续或没有等待对象被其他例程填充。

希望对你有帮助。

【讨论】:

    【解决方案3】:

    您的解析函数是异步调用的。您需要等待解析函数被调用才能测试它。

    要么在解析函数中测试结果,要么让另一个函数作为 ajax 调用的回调。这个函数调用parse然后测试结果。

    【讨论】:

      猜你喜欢
      • 2012-06-23
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      相关资源
      最近更新 更多