Javascript 是否有任何理由故意引入封闭装置以防止可变提升?

Javascript 是否有任何理由故意引入封闭装置以防止可变提升?,javascript,variables,closures,Javascript,Variables,Closures,考虑以下代码: for (var j = 0; j < 10; j++){ // ... } 。。。为了防止变量提升行为,并停止Netbean的投诉?是因为您正在重新说明变量而投诉吗?您可以删除第二个变量,因为它已经在作用域中。在闭包中包装循环对我来说似乎是不必要的,并且如果您在for循环中定义要在循环外部使用的变量,则可能会导致问题。例如: (function() { for (var j = 0; j < 10; j++) { var foo = "bar"

考虑以下代码:

for (var j = 0; j < 10; j++){
    // ...
}

。。。为了防止变量提升行为,并停止Netbean的投诉?

是因为您正在重新说明变量而投诉吗?您可以删除第二个变量,因为它已经在作用域中。

在闭包中包装循环对我来说似乎是不必要的,并且如果您在
for
循环中定义要在循环外部使用的变量,则可能会导致问题。例如:

(function() {
  for (var j = 0; j < 10; j++) {
    var foo = "bar"
  }
});

// foo is undefined here
(函数(){
对于(var j=0;j<10;j++){
var foo=“bar”
}
});
//这里没有定义foo
鉴于:

for (var j = 0; j < 10; j++) {
  var foo = "bar"
}

// foo is defined here
for(var j=0;j<10;j++){
var foo=“bar”
}
//这里定义了foo

从微观性能的角度来看,闭包也会产生不必要的开销,因为正如其他人所说,如果将
var
从第二个
for
循环中去掉,它应该停止抱怨。

Javascript变量具有函数范围-而不是您可能习惯的块范围。(这是我们必须习惯的Javascript的一大缺点)

通常的样式规则建议最好在函数开头声明所有变量,包括循环变量。(不要在for语句中声明它们——这在其他语言中是有意义的,但在Javascript中是没有意义的)

希望这能让编译器冷静下来


(您不必担心两个循环使用同一个变量太多-变量无论如何都会重新初始化)

问题在于javascript变量不是
块范围的
,而是
函数范围的

假设您有这样一个片段

function MyDemo(){
    var i = 0;
    for( var j = 0; j < 10; j++ ){
        ++i;
    }
    alert( i );
    alert( j );
}
函数MyDemo(){
var i=0;
对于(var j=0;j<10;j++){
++一,;
}
警报(一);
警惕(j);
}
在javascript中,j将被警告为10,而在C#或Java之类的块范围语言中,它类似于未在上下文中定义的j

这就是问题所在,解决方案不是将其封装在一个闭包中

为什么不使用另一个变量或重新初始化同一个变量而不重新声明


有用链接:

99%的时候,额外函数调用对运行时性能的影响是无关紧要的。更重要的是,额外的代码会使您的代码库变得杂乱无章,使内容更难阅读。我想说的是,不要仅仅为了IDE而将其包装在函数调用中。

为什么有人希望在循环内部创建一个变量,使其在外部可见?首先在外部创建它!我完全同意,但是你永远不知道谁会在以后的代码行中提取你的代码,如果你在一个闭包中包含了
for
循环,这可能会使另一个程序员感到困惑,他可能会在
中为
循环声明变量,以便在循环之外使用。@missingno:您可能想看看循环是否正常结束或中断。我知道函数的作用域,我想我会接受您的建议,在开始之前声明所有变量。谢谢
function MyDemo(){
    var i = 0;
    for( var j = 0; j < 10; j++ ){
        ++i;
    }
    alert( i );
    alert( j );
}