真的在IE11JavaScript中为true

真的在IE11JavaScript中为true,javascript,gwt,smartgwt,internet-explorer-11,Javascript,Gwt,Smartgwt,Internet Explorer 11,我们在IE11上的web应用程序中面临着一个非常奇怪的问题(其他IE版本工作正常)。 该应用程序基于SmartClient javascript框架上的SmartGWT()-GWT包装器 IE11进入了永无止境的循环。 它发生的非常随机,我们没有步骤来复制它。应用程序的复杂性使得我们无法发布代码示例。 通常情况下,当用户使用应用程序时,他们会最小化浏览器窗口,并在一段时间后恢复该窗口并尝试继续工作 当表达式“true==true”的结果为false时,奇怪的比较结果会导致永无止境的循环 比较代码

我们在IE11上的web应用程序中面临着一个非常奇怪的问题(其他IE版本工作正常)。 该应用程序基于SmartClient javascript框架上的SmartGWT()-GWT包装器

IE11进入了永无止境的循环。 它发生的非常随机,我们没有步骤来复制它。应用程序的复杂性使得我们无法发布代码示例。 通常情况下,当用户使用应用程序时,他们会最小化浏览器窗口,并在一段时间后恢复该窗口并尝试继续工作

当表达式“true==true”的结果为false时,奇怪的比较结果会导致永无止境的循环

比较代码为:

$wnd.isc.isA.Canvas(obj) === true
代码在包含GWT编译的javascript的iframe范围内执行

$wnd是加载SmartClient Java脚本的web应用程序的主(顶部)窗口

isc.isavans(..)是一个返回true或false的方法,这取决于作为参数传递的对象是否为Canvas类型-Canvas是来自SmartClient framework的特殊类,而不是HTML Canvas元素

isc.isA.Canvas = function (object) {
  return (object != null && object._isA_Canvas);
}
_创建对象时,对象上的isA_画布设置为true(布尔值true不是字符串形式的“true”)

我在使用有问题的比较的部分添加了一些测试代码-下面是一个简化版本:

var trueCheckCount = 0;
function isCreated(id){
  var obj = $wnd.window[id];    // objects are stored in window by id

  var comparisonResult = $wnd.isc.isA.Canvas(obj) === true;

  if (!comparisonResult ) {
    if ($wnd.isc.isA.Canvas(obj) == true) {
      alert("TRUE != TRUE  (was OK: " + trueCheckCount + "x before)");
    } else {
      trueCheckCount++;
    }
  }

  return comparisonResult;
}
在不同的测试运行中,警报在不同的通过次数后显示。例如,在第一次跑步中,它通过了358698次,在第二次跑步中,它通过了330125次

有人知道问题出在哪里吗? “真的”怎么可能真的吗

环境:

IE11 (Windows7/8)
SmartGWT: v9.0p_2014-03-02/LGPL Development Only (built 2014-03-02)
GWT: 2.4
在屏幕截图上可以看到一些其他调试信息:
问题在
SmartGWT
中占99%。我建议您向SmartGWT团队报告此问题,当然要使用最新的GWT编译器。我们之前处理过SmartGWT,根据我的经验,我应该说当时它是一个相当有缺陷的库。

调试代码中有两个问题可能会给您留下错误的印象:

if ($wnd.isc.isA.Canvas(obj) == true) {
    alert("TRUE != TRUE  (was OK: " + trueCheckCount + "x before)");
} else {
首先,您在这里做了一个双等比较,前面您做了一个
==
比较。这些是不同的,如果被测试的变量不是布尔值,则会给出不同的结果

因此,例如,如果$wnd.isc.isA.Canvas(obj)输出的是一个整数
1
或类似的东西,而不是
true
,那么您将得到您所描述的问题

为什么不使用
JSON.stringify

console.log(JSON.stringify($wnd.isc.isA.Canvas(obj)));
这将准确地向您显示值是什么,然后应该相当清楚地向您显示为什么比较没有达到您期望的效果

其次,使用
alert()
框显示错误不是一个好主意,尤其是在复杂的应用程序中。您应该始终使用
console.log()
进行调试,而不是使用
alert()
,因为
alert()
可能会导致某些JS代码改变其行为,这会使调试变得非常困难

这是因为
alert()
会在JS显示时阻止JS执行,这意味着在此期间触发的任何事件处理程序或其他异步代码都可能会超出预期的顺序

考虑到提供的代码示例,我认为这不一定是您在这里遇到的问题,但是如果您有任何Ajax调用、
setInterval()
s或其他类似的异步代码,那么您确实需要避免使用
alert()
进行调试


希望能有所帮助。

问题是由IE11中的一个错误引起的

微软发布了修复程序。它包含在12月份的Internet Explorer累积更新KB3008923中

安装此更新解决了我们的问题

我们得到的技术细节是:

问题中的bug与回收JIT函数和跨站点Thunk有关。 具有跨站点thunk的函数正在被回收。 然后我们将入口点更改为解释器tunk,在这个过程中丢失跨站点的thunk。 调用此函数时未完成编组。
在所讨论的复制中,我们最终得到一个来自不同scriptContext的布尔True对象,与===比较时,该对象与当前scriptContext中的对象不匹配。

请稍等。。我没有读所有的东西,但这很搞笑。你是说如果你做的是真的控制台中的true表示true?您也应该提醒
$wnd.isc.isA.Canvas(obj)
的值,以确保在这些时刻将其设置为
true
。请参见IE11控制台屏幕截图:我已经向SmartGWT团队报告了此问题,但到目前为止没有响应。是的,我知道“==”和“==”的区别,这不是问题所在。我故意将警报放在那里,以便在问题发生时停止执行。请参阅屏幕截图,这里有来自IE11控制台的其他信息。