2010-01-22 42 views
1

Soooooooooooooooo ...如果条件评估为false,javascript是否仍为“IF”方案分配内存?

我看到一个声明,如果现在将评估到的时间,其中包括支票的真实99.7%,如果浏览器的DOM 1+能力,然后加载的大块码。

因此,放置一个“if(true)”并省略“else”部分是合乎逻辑的,但我不知道在最终决定中断执行之前,旧版浏览器是否仍会继续解析代码并分配内存。 ...

我不在乎这一点,因为我们已经有10年以上的体面的浏览器,但为了将来的参考,我希望有人知道。

我想我的问题或多或少是这样的:浏览器解析整个文件并在执行第一个条件语句之前分配内存,这是第一个事情之前的第一件事?

在此先感谢:)

回答

2

有两件事情从执行上下文中悬浮出来,并且即使代码永远不会到达,也会产生效果:functionvar

把一个var声明在一个码块将“保留存储器”该变量一旦块被输入,但该变量的值仅是一个指向undefined对象,所以这只是一个平凡小字节数。

把一个function语句中的码块都将“保留存储器”为变量并评估function,分配所得Function对象的变量,代码块中的第一行之前被执行。这就是你可以调用一个函数的方式,这个函数只在脚本的后面定义。

根据ECMAScript标准规则,您只能将function语句放在代码块的根部;这就是说:

if (true) { 
    function f() { 
     ... 
    } 
} 

是非法的。但是,浏览器通常仍然会允许它,而在浏览器之间进行浏览时会发生什么情况。避免这种情况。 (也避免命名内联函数表达式,这是错误地受限于IE的JScript的提升和双评价)。

如果你真的想停止任何内存被分配变量和函数你不打算使用,把它们放在他们自己的功能块中。无论如何,这是维护库代码中干净名称空间的常用策略。例如:

if (condition) (function() { 
    var foo= 1; 
    function bar() { 
     alert(foo); 
    } 
})(); 

通过这样做可以节省的内存量非常小。

但今天的每个主要浏览器都是DOM级别1的能力;如果您的脚本中有备份代码以支持Netscape 4,那么过去很长的时间才能删除它。现在基线桌面浏览器是IE6。

目前唯一使用的简单DOM操作仍然是问题的浏览器是IEMobile,IEMobile 8/WinMobile 6.1.4之前的版本。然而,这个浏览器是如此糟糕,几乎没有脚本会按原样工作;几乎所有的事情都需要解决方法。

+0

谢谢你这样详细的解释! 我实际上没有任何过时的浏览器的备份代码,因此缺少“其他”,但我所做的只是检查getElementById的存在。如果评估结果为false,则不执行任何其他操作。让任何超出他们能力的旧浏览器窒息。我很确定移动浏览器应该悄悄地出错,但我只是很好:)再次感谢。你的解释与JS引擎所期望的更接近,但从我的角度来看,这只是一个疯狂的猜测 – Alin 2010-01-22 13:11:13

1

是的,浏览器将解析整个文件。至于“内存分配”部分。如果您的意思是“为文件中定义的所有变量分配内存”,则不会,只有在执行流程到达该变量时才分配内存。

+0

只是好奇,你是基于对JS引擎的通用理解提到的吗? – 2010-01-22 11:40:48

+0

谢谢:) 因此,看起来第一个条件可以充当“门”,并将内存使用量保持为JS文件的大小,然后在用户移动到下一页时将其作为GC_d ... 这是相当痛苦,恕我直言 – Alin 2010-01-22 11:53:33

+0

我主要担心的是,JS引擎会映射内存的解析时遇到的对象的数量,但不一定填充任何东西。如果情况如此,它仍然是不必要的膨胀,但在某种程度上我会猜测它简单地解析代码并评估语句......有点像它们的队列.... 再次感谢 – Alin 2010-01-22 11:59:55

相关问题