有两件事情从执行上下文中悬浮出来,并且即使代码永远不会到达,也会产生效果:function
和var
。
把一个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之前的版本。然而,这个浏览器是如此糟糕,几乎没有脚本会按原样工作;几乎所有的事情都需要解决方法。
谢谢你这样详细的解释! 我实际上没有任何过时的浏览器的备份代码,因此缺少“其他”,但我所做的只是检查getElementById的存在。如果评估结果为false,则不执行任何其他操作。让任何超出他们能力的旧浏览器窒息。我很确定移动浏览器应该悄悄地出错,但我只是很好:)再次感谢。你的解释与JS引擎所期望的更接近,但从我的角度来看,这只是一个疯狂的猜测 – Alin 2010-01-22 13:11:13