Javascript对象和变量范围

时间:2016-06-25 16:56:46

标签: javascript

有人可以向我解释一下吗?

这有效:

function Pin() { };
function Pi() { };
function User() { };

var PiArray = [];
var PinArray;

for (var i = 0; i < 2; i++) {
    PiArray[i] = new Pi();
    PiArray[i].Name = '';
    PiArray[i].PinArray = [];
    for (var j = 0; j < 25; j++) {
        PiArray[i].PinArray[j] = new Pin();
        PiArray[i].PinArray[j].Number = j + 2;
        PiArray[i].PinArray[j].PulseWidth = 0;
        PiArray[i].PinArray[j].PulseFrenquency = 0;
        PiArray[i].PinArray[j].Dirtybit = false;
    };
}

/* Output is 

[{"Name":"","PinArray":[{"Number":2,"PulseWidth":0,"PulseFrenquency":0,"Dirtybit":false},{"Number":3,"PulseWidth":0,"PulseFrenquency":0,"Dirtybit":false},{"Number":4,"PulseWidth":0,"PulseFrenquency":0,"Dirtybit":false},

etc.

*/

但是我无法弄清楚如何将它变成一个对象,变量的范围不像我期望的那样。

这就是我尝试过的一个例子:

function Pin() { };

function Pi() { };

var User = (function () { 

    PiArray = [];

    function User() {
        var PinArray;
        for (var i = 0; i < 2; i++) {
            PiArray[i]= new Pi();
            PiArray[i].Name = '';
            PiArray[i].PinArray = [];
            for (var j = 0; j < 25; j++) {
                PiArray[i].PinArray[j] = new Pin();
                PiArray[i].PinArray[j].Number = j + 2;
                PiArray[i].PinArray[j].PulseWidth = 0;
                PiArray[i].PinArray[j].PulseFrenquency = 0;
                PiArray[i].PinArray[j].Dirtybit = false;
            };
        }
    }

    console.log(JSON.stringify(PiArray));
    return User;
})();

new User();

,输出为:

[ ]

我不明白为什么?

1 个答案:

答案 0 :(得分:3)

你的console.log(JSON.stringify(PiArray));在第二种情况下显示一个空数组,因为在它运行时,你还没有调用函数User()。 IIFE只定义函数User()然后返回它。它实际上并没有称之为。

您之后的代码new User()确实在调用它,但是在console.log()已经执行之后就已经过了。

console.log()移动到User()函数定义的末尾(但在函数内),您将看到预期的值。

function Pin() { };

function Pi() { };

var User = (function () { 

    PiArray = [];

    function User() {
        var PinArray;
        for (var i = 0; i < 2; i++) {
            PiArray[i]= new Pi();
            PiArray[i].Name = '';
            PiArray[i].PinArray = [];
            for (var j = 0; j < 25; j++) {
                PiArray[i].PinArray[j] = new Pin();
                PiArray[i].PinArray[j].Number = j + 2;
                PiArray[i].PinArray[j].PulseWidth = 0;
                PiArray[i].PinArray[j].PulseFrenquency = 0;
                PiArray[i].PinArray[j].Dirtybit = false;
            };
        }
        console.log(JSON.stringify(PiArray));
    }

    return User;
})();

new User();

仅供参考,目前还不清楚您要使用此结构完成什么,因为PiArray只能从您的构造函数中获取。一旦调用了构造函数,就没有其他代码可以访问它或使用它。加上对构造函数的所有调用都将修改相同的PiArray。在此上下文中,PiArray的工作方式类似于静态类(因为该术语在其他语言中使用)。它是类的所有实例共享的公共变量,但不能在对象本身的代码之外访问。

如果您在User对象上有其他方法,那么他们也可以访问PiArray,并且拥有它可能更有意义。

您可以创建一个存储有不同数组的实例,如下所示:

var MyObj = function(data) {
    // assign a copy of the passed-in array as instance data
    // You don't have to make a copy - you could just assign in incoming array
    this.data = data.slice(0);
}

var x = new MyObj([1,2,3]);
var y = new MyObj([9,8,7]);
console.log(x.data);    // [1,2,3]
console.log(y.data);    // [9,8,7]