5

我想知道下面显示的序列是如何发生的。

这是有问题的功能:

WebSocketConnector.prototype.sendMessage = function(message) {
    if (socket !== null) {
        socket.send(message);
        console.log('Sent: ' + message);
    } else {
        alert('Failed to send message. WebSocket connection not established.');
    }
};

以下是我调试对该函数的调用时发生的情况:

1. 从第 32 行开始。

如果条件

2. Step In,前进到第 33 行。

if 块的第一行

3. 再次 Step In,前进到第 34 行。

if 块的第二行

4. 再进一次,前进到第 36 行???

else 块的第一行

--> 怎么可能直接从 if 块的最后一行else块的第一行呢?

一些重要的事实:

  1. 这里没有遗漏的步骤。
  2. 这真的发生了。
  3. 我只sendMessage从一个地方打电话,当那个电话发生时我正在记录。日志中没有下落不明的sendMessage呼叫,所以我不认为异步是一种解释。
  4. 我也用 Firebug 调试器尝试了同样的事情,同样疯狂的事情发生了。

编辑/跟进

如果我将 console.log 语句添加到 else 块的第一行(将警报向下推到第 37 行),控件将从第 34 行直接转到第 37 行(跳过 console.log 语句)。

另外,我应该提到,即使直接进入该代码,实际上也不会出现任何警报。

编辑 2

这是sendMessage函数的间距和 CRLF:

在此处输入图像描述

4

2 回答 2

3

这是因为调试器在返回调用堆栈帧之前会跳到最后一个可执行行。alert()在您的情况下,这是包含该函数的第 36 行。如果调试器跳转到函数的右大括号,即第 38 行,会更清楚。

已经有报告可以改变这种行为:

https://bugzil.la/1013219

于 2014-10-17T22:34:53.493 回答
1

不幸的是,Firefox 中的调试器有一些非常奇怪的行为。如果您所描述的可能与此错误有关,我不会感到惊讶。“step”功能有时不会像您所期望的那样,或者 Chromium 浏览器所做的那样。

于 2014-10-18T03:29:05.587 回答