Internet Explorer 8(我需要支持,不幸的是,不可协商)显示the following warning once 5,000,000 "executed script statements" have occurred in one synchronous script execution(例如,来自超时或来自事件处理程序)。对于IE的“停止运行此脚本?”,什么是“执行脚本语句”?警告柜台?
停止运行此脚本?此页上的脚本导致您的网络浏览器运行缓慢。如果它继续运行,您的计算机可能会变得无响应。
我想优化一些复杂的重型代码,以避免此错误消息。我已经遵循标准的建议,这是尽可能的使用诸如setTimeout()
之类的东西将代码拆分成单独的异步块。如果不创建竞争条件,我不能再做这些事情,所以我期望简化所有发生多次的代码,例如在大的for
循环内。
要做到这一点,我想知道究竟是什么IE算作一个“执行的脚本语句”,所以我会知道我在循环中的优化将发挥最大作用而哪些不会。
我查找了“执行的脚本语句”的标准定义,但没有成功 - 大多数时候使用了“脚本语句”,它似乎是指html <script>
标记的内容,这显然是不同的术语。定义Statement (computer science)很有帮助,但它们如何计算的含义不明确(请参阅下面的示例)。
Here's what Microsoft have to say on the matter(为便于阅读,我已经添加了一段时间):
如Internet Explorer 4.0及更高版本,超时不再是基于Windows消息的固定值。 Internet Explorer现在会跟踪执行的脚本语句的总数,并在每次使用脚本引擎为当前页面启动新脚本执行(例如从超时或事件处理程序)时重置该值。
当该值超过阈值时,Internet Explorer将显示一个“长时间运行的脚本”对话框。
Internet Explorer不检查每条指令是否超出限制。脚本引擎定期对所执行的语句数进行轮询,然后Internet Explorer检查是否超出限制。由于这种机制,如果在脚本引擎轮询Internet Explorer之前完成整个脚本的执行,则可以在没有对话框的情况下执行超过默认限制。
举,似乎模棱两可给我一些简单的例子:
- 将
var a = 1, b = 2, c = 3;
算一个“执行的脚本语句”和var a = 1; var b = 2; var c = 3;
数三?或者都是三个? - 将
if(someFunction()){}
(不包括内someFunction()
语句是一个语句,或两个(一个电话加一个条件)? - 是
if(a){}else{}
一个条件语句或两个?如果有,会if(a){}else if(b){}
是两个? - 是
if(a==b||(c&&a==c&&c==d)){}
一个,两个,三个,四个,五个陈述(或更多?)?我知道,像if(a){}
这样的任何东西都会调用一个Javascript函数来转换为布尔值 - 这是否会在比较本身上添加其他语句? - 将
var value = someFunction(); if(value){}
三个,因为它增加了一个赋值,或者将函数调用作为赋值语句的一部分吗? - 链接怎么样?例如,如果使用jQuery,那么(不包括执行的脚本语句内的每个函数)是行
$(selector).show().css(obj).appendTo($el);
一个“已执行的脚本语句”,还是四个?我想可能会是四个“呼叫”声明。 - 据推测,var
$someEl = $(selector).show().css(obj).appendTo($el);
会将此增加到五个语句 - 四个呼叫加分配? (IE将不只是指望它作为一个赋值语句被感动吗?)
当然以上这些简单的例子是小混混 - 我试图“了解敌人”这里可以判断如何最好优化复杂的循环。
我正在寻找无论是经验法则或一些解释例子像上面
我不能说明确的,但'var whatever'几乎肯定不会计数,因为该语句不在运行时运行。除此之外,它的_probably_一行代码执行,如果if(foo){'或您的长jQuery链在最后。然而,jQuery链可能会在jQuery库中运行几百行代码。换句话说,#1是0,#5是2(用分号隔开),其他所有的都是1.但是你必须遵循代码路径来查看在#2,#5中实际运行了多少代码, #6,#7 –