Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.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/9/loops/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
在JavaScript循环中声明相同的变量名_Javascript_Loops_Variables - Fatal编程技术网

在JavaScript循环中声明相同的变量名

在JavaScript循环中声明相同的变量名,javascript,loops,variables,Javascript,Loops,Variables,此示例中的所有内容均已清除(请参见变量条目声明): 使用“use strict”不会引发错误,但这样声明entry是否是一种好的做法 var list = { a:1, b:2, c:3 }; for( var i in list ) { var entry = list[ i ]; // ... } JavaScript没有块级别的作用域。因此,循环内的var条目在循环外也可用(即,两个声明相同)。为了可读性,我喜欢在循环内声明它们,只是为了明确变量只在循环内使用(尽管我

此示例中的所有内容均已清除(请参见变量
条目
声明):

使用“use strict”不会引发错误,但这样声明
entry
是否是一种好的做法

var list = { a:1, b:2, c:3 };

for( var i in list )
{
    var entry = list[ i ];

    // ...
}

JavaScript没有块级别的作用域。因此,循环内的
var条目
在循环外也可用(即,两个声明相同)。为了可读性,我喜欢在循环内声明它们,只是为了明确变量只在循环内使用(尽管我知道它在循环外可用)。如果希望在循环外部使用
条目
,则在循环外部声明它;不要在内部声明它,然后在外部使用它(这可能会让阅读代码的人感到困惑,即使代码工作正常)。

JavaScript没有只包含块作用域的函数作用域,因此两者应该是相同的

循环中的变量将被“提升”以在函数级别声明,如第一个示例中所示

同样的概念实际上也适用于
var i
。它也将被提升到功能的顶部

第二种模式的一个微观优化是将更少的代码向下传输到客户端。不过,如果名称过长,这将更加明显。但这并不是一个实际的原因


但是,包含var关键字非常重要。否则,它将被“提升”到全局范围内,这在任何时候都是不受欢迎的。

这取决于你想做什么。如果您想遍历列表,执行一些操作并保留最后一个条目,那么第一种方法是明确的。如果没有,最好保持代码清晰。我很久以前听过一句智慧的话,“在使用变量之前先声明变量。”没有理由抱怨,因为你正确地声明了变量

if (1) {
    var x = 'hey';
}
console.log(x);

-我没有意识到JavaScript是函数级别的作用域。那太可悲了。不要做我在例子中提到的事情。我一直在PHP中看到它,它使代码无法读取。

当您在JavaScript中声明一个变量时,您分配了大量内存,我并不完全确定分配了多少。是的,JavaScript没有块级别的作用域,理论上,该变量的声明应该替换与原始变量相同的内存位置,但它可能在“垃圾收集器”处理之前复制内存位置。在for循环中声明变量可能会导致内存大幅增加,无论如何都不是一种好的做法。是的,内存最终会被清除,但只有在“垃圾收集器”找到内存后才会被清除。我建议像第一种方法那样声明变量。

因为变量宿主是在
var
语句中出现的,所以通常最好将变量声明放在函数的顶部(尽管这主要是基于观点的)

当您有很多局部变量时,这可能会损害可读性,但是有许多局部变量也表明可以进行一些重构,例如


还请注意,该语句将允许ES6中的块作用域。

建议在顶部声明变量,因为javascript将以这种方式解释它们:最好在顶部列出变量,即使最初为空,以后重复。如果要声明其使用位置,为什么你不在它后面加一条注释,而不是在内存中进行大的跳转和跳转,只得到澄清的结果。@WebLoverter AFAIK,变量声明在JS中被挂起,所以你所描述的不应该发生。它们不会立即挂起,它们会挂在那里,等待垃圾收集器过来照顾它们,我已经测试过很多次了。这将导致内存暂时上升。如果您观察正在运行的浏览器,您应该会看到内存使用的波动。在本例中,因为他在一个短的运行循环中只声明了一个变量,所以数量将是分钟,但是想象一下,在一个密集递归函数/循环中使用大量变量时,消耗量会有多大。这有很大的不同。这都是关于堆栈和堆的,是的,JavaScript中会出现“堆栈外”错误。@WebWander您将声明与赋值混淆了。变量只声明一次;在函数的顶部。在函数的堆栈框架内,您已经为该局部变量指定了一个位置。而且,你的方法甚至不能解决问题。即使您在外部声明
entry
,您仍将继续重新分配它,这意味着非引用值必须在某个时候进行垃圾收集。变量声明将被挂起。所以你实际上不会一次又一次地声明变量。它们不会立即被提升,但是是的,它们被提升了。我在你的帖子上写了很长的评论。谢谢你的否决票。当你在做这件事的时候,你来研究一下堆栈和堆的各个部分。另外,制作一些测试应用程序,以显示哪个应用程序运行方式不同,占用更多内存。然后,如果你仍然认为你是对的,给我回个信息,让我看看你的代码。我已经反复试验过了,我没有投你反对票。此外,我已经知道堆栈和堆是如何工作的。:)你能给我发一个链接到你的性能测试吗?我也很乐意,但我不太确定如何作为一个小提琴来运行这个性能测试。六羟甲基三聚氰胺六甲醚。。。我有一个服务器,但我真的想麻烦地把两个普通页面放在那里进行调试吗?我可能会的。如果我把这个测试放在某个地方,我一定会在这里发布一个链接。你可以试试jsperf.com。我试过了,没有发现任何明显的差别。
if (1) {
    var x = 'hey';
}
console.log(x);