变量范围的后果

时间:2017-05-05 10:11:19

标签: javascript

以下两段代码之间的区别是什么?

之一。

        var arr = [70,80,150,310,260,100,78];
        var pointArr=[];
        var point={};

        for (var i = 0; i < arr.length; i++) {
          point.x=i*80;
          point.y=(arr[i]/600)*240;
          pointArr.push(point);
           console.log(point);
         console.log(pointArr);

        }

两个

        var arr = [70,80,150,310,260,100,78];
        var pointArr=[];


        for (var i = 0; i < arr.length; i++) {
        //diff
            var point={};
          point.x=i*80;
          point.y=(arr[i]/600)*240;
          pointArr.push(point);
           console.log(point);
         console.log(pointArr);

        }

结果: 一 enter image description here

2 enter image description here

3 个答案:

答案 0 :(得分:0)

对于代码一,point初始化一次。而对于代码二,它是为每个循环初始化的。

答案 1 :(得分:0)

当你在循环中初始化变量时,它会在每次迭代时初始化(重置)。这意味着您将每次for循环运行时将数据推送到空对象并记录该对象,而不是连续推送到第一个示例中在循环外创建的对象。这有意义吗?

答案 2 :(得分:0)

在JavaScript中通过引用传递对象。而原始类型是按值传递的,而且是不可变的。

因此,在您的第一个代码示例中,变量point将以指针的形式存储在内存中作为引用。在循环内部,您继续将相同的引用推送到pointArr。更改x的{​​{1}}和y属性只会更改引用的值。这与循环本身无关。

只需将您的第一个示例更改为以下内容:

&#13;
&#13;
point
&#13;
&#13;
&#13;

通过查看控制台输出,您可以看出在var arr = [70,80,150,310,260,100,78]; var pointArr=[]; var point={}; for (var i = 0; i < arr.length; i++) { point.x=i*80; point.y=(arr[i]/600)*240; pointArr.push(point); } window.setTimeout(function() { point.x = 'foo'; point.y = 'bar'; console.log(pointArr); }, 2000)内有多次出现相同的引用。

通过在循环中重新声明pointArr,就像在第二个示例中所做的那样,您只需为每个点创建一个新的引用。 您可能需要查看以下链接,以便更详细地解释这一点。

Primitive Types and Reference Types

希望有所帮助。