Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript是否仍然为;如果;如果条件的计算结果为false,会出现什么情况?_Javascript - Fatal编程技术网

javascript是否仍然为;如果;如果条件的计算结果为false,会出现什么情况?

javascript是否仍然为;如果;如果条件的计算结果为false,会出现什么情况?,javascript,Javascript,好啦好啦 我有一个IF语句,现在99.7%的时间都是正确的,它包括检查浏览器是否支持dom1+功能,然后加载一大块代码 因此,逻辑上应该加上“if(true)”,而省略“else”部分,但我想知道,在最终决定中断执行之前,旧浏览器是否还会继续解析代码并分配内存 这一点我并不在意,因为我们已经有了10多年的优秀浏览器,但作为将来的参考,我希望有人知道 我想我的问题或多或少是这样的:浏览器是否在执行第一条条件语句之前解析整个文件并分配内存,这是在执行任何其他语句之前的第一件事 提前感谢:)是的,浏览

好啦好啦

我有一个IF语句,现在99.7%的时间都是正确的,它包括检查浏览器是否支持dom1+功能,然后加载一大块代码

因此,逻辑上应该加上“if(true)”,而省略“else”部分,但我想知道,在最终决定中断执行之前,旧浏览器是否还会继续解析代码并分配内存

这一点我并不在意,因为我们已经有了10多年的优秀浏览器,但作为将来的参考,我希望有人知道

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


提前感谢:)

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

有两件事被挂起到执行上下文之外,即使从未到达相关代码,也会产生影响:
函数
变量

在代码块中放置
var
声明将在输入块后立即为该变量“保留内存”,但该变量的值将仅是指向
未定义的
对象的指针,因此它只需要少量字节

在代码块中放入
函数
语句将为变量“保留内存”,并在执行块中的第一行代码之前计算
函数
,将结果
函数
对象分配给变量。这就是如何调用只在脚本后面定义的函数

在ECMAScript标准规则下,只能将
函数
语句放在代码块的根中;也就是说:

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之前的版本。然而,这个浏览器是如此糟糕,几乎没有脚本会像现在这样工作;几乎所有的事情都需要解决方法。

只是好奇,你提到的是基于对JS引擎的一般理解吗?谢谢:)所以第一个条件似乎可以充当“门”,并将内存使用保持在JS文件的大小,然后在用户移动到下一页时对其进行GC。。。这相当轻松,我主要担心的是JS引擎会根据解析时遇到的对象数映射内存,但不一定会用任何东西填充它们。这仍然是不必要的膨胀,如果是这样的话,在某种程度上会很明显。。。但我现在猜它只是简单地解析代码,并在语句出现时对其求值……有点像它们的队列。。。。谢谢again@o.k.w我对任何语言的内部结构都没有深入的了解,但所有语言通常都是这样工作的。谢谢你这么详细的解释!实际上,我没有任何过时浏览器的备份代码,因此没有“else”,但我所做的只是检查getElementById是否存在。如果计算结果为false,则不会执行其他操作。防止旧浏览器阻塞超出其能力范围的内容。我很确定手机浏览器会悄悄地出错,但我只是想说:)再次感谢。您的解释更接近于对JS引擎的预期,尽管从我的角度来看,这只是一个猜测