for循环中的范围

时间:2015-05-27 21:34:20

标签: javascript

我开始在for循环中使用IIFE,如下所示:

<select id="country" name="country">
    <option value="usa">USA</option>
    <option value="canada">Canada</option>
</select>
<div id="state"></div>

$(function(){
$("#country option").click(function(){

        $(this).each(function(){
            if($(this).val()=="canada") {
                $("#state").html('<select id="province" name="province"><option value="">Please select your province...</option></select>');
                console.log('Canada baby!');
            }
        });
    });
});

我这样做的主要原因是为for循环提供了一些范围,因此变量不会逃避此范围。这样做是否有任何负面影响/表现?如果是这样,他们受到的伤害程度如何?谢谢!

1 个答案:

答案 0 :(得分:3)

是的,将for语句的正文包装到匿名函数中会产生性能成本。问题是为每次迭代创建新函数对象的成本。也就是说,对于每次迭代,都会创建一个具有自己范围的新函数对象。

Performance comparison named vs anonymous function 这是命名函数和函数声明之间的一个小比较,它可以帮助您理解对代码性能的影响。请注意,在您的情况下,问题不是匿名函数,而是创建函数对象的成本。

<强> ES6

我理解,您正在尝试将变量范围限定为for。我建议另一个解决方案来实现这一目标。如果可以,请尝试使用ES6中的let关键字。

我们引入了let关键字来克服var的所有缺陷,例如此缺陷。 let允许您声明范围受限于for块的变量。

From the documentation

  

let允许您声明范围有限的变量   使用它的块,语句或表达式。这与此不同   var关键字,它全局定义变量,或者本地定义变量   整个函数,无论块范围如何。