Javascript无法在另一个函数内调用推送数组

时间:2014-07-25 01:38:17

标签: javascript arrays function push undefined-behavior

我有一个非常简单的JavaScript问题......

我有一个函数 Pets ,它包含三个变量:整数,字符串和定义如下的数组:

function Pets() {
    var index;
    var name;
    var animals = ["cat", "dog"];
}

在另一个函数中,我声明了一个类型为 Pets 的变量,并推送" mouse"到 animals 数组。然后我做一个控制台日志来查看值。

function Test() {
    ...
    var pets = new Pets();
    pets.index = 1;
    pets.name = "My Pets";
    pets.animals.push("mouse");
    console.log(pets);
}

无论出于何种原因,我都没有从控制台看到任何输出。

然后我在调用animals.push:

之前和之后添加了一些控制台记录
    var pets = new Pets();
    pets.index = 1;
    pets.name = "My Pets";
    console.log("BEFORE PUSH");
    console.log(pets);
    pets.animals.push("mouse");
    console.log("AFTER PUSH");

这是我的输出:

BEFORE PUSH
Pets {index: 1, name: "My Pets"} 

请注意,我只看到第一个控制台日志,而不是第二个(推送后),我认为这表示调用 animals 上的推送有问题。

另请注意,控制台输出显示Pets有一个名为 index 的属性和一个名为 name 的属性,但它没有表明还有一个名为动物这是我的阵容。

我尝试将数组声明更改为:

var animals = new Array();

但这似乎也无济于事。

在我将元素推送到它之前,我是否需要做一些特殊的事情来初始化animals数组?更一般地说,为什么房产动物甚至不会出现在Pets类的一部分?

谢谢,

3 个答案:

答案 0 :(得分:2)

您正在以不会在Pets构造函数

之外显示变量的方式声明变量

这就是为什么你没有看到第二个控制台,因为行

pets.animals.push("mouse");

将抛出错误 TypeError:无法读取未定义的属性'push'(或取决于浏览器的类似情况)。这将导致脚本的其余部分停止执行。

您在第一个控制台日志中看到indexname的唯一原因是您在创建Pets对象后在对象上创建它们。您需要使用this运算符或在原型

上设置它们来声明它们
function Pets() {
    this.index = null;
    this.name = null;
    this.animals = ["cat", "dog"];
}

答案 1 :(得分:0)

您是否尝试在声明期间将变量分配给窗口而不是使用var?设置它像window.myVar = [“var1”,“var2”]

答案 2 :(得分:0)

您无法以这种方式访问​​Pets的任何属性,因为它们不会暴露于外部功能。您正在通过说

来创建属性索引和名称
pets.index = ...

你必须改变你的代码:

function Pets() {
    this.index;
    this.name;
    this.animals = ["cat", "dog"];
}
function Test() {
    var pets = new Pets();
    pets.index = 1;
    pets.name = "My Pets";
    pets.animals.push("mouse");
    console.log(pets);
}
Test();