通过在函数上传递引用来初始化变量

时间:2011-11-25 16:30:47

标签: javascript global-variables pass-by-reference

我想知道如何通过将变量作为函数的引用来初始化变量。这是代码:

var carToy, trainToy;

function setToyValue(name, description, toy) {
    toy = new makeToy(name, description);
}

function makeToy(name, description) {
    this.name = name;
    this.description = description;
}

function start() {
    setToyValue("toy car", "red, 4 wheels", carToy);
    setToyValue("train car", "green, with 5 wagons", trainToy);
    console.log(carToy);
    console.log(trainToy);
}

start();

显然,最后,carToy和trainToy仍未定义......有关如何做的任何建议吗?这是小提琴 - > http://jsfiddle.net/Osoascam/8YMsz/

2 个答案:

答案 0 :(得分:4)

JavaScript 行为以不同方式(稍微)通过引用传递。基本上所有东西都是通过JavaScript传递的。如果你将一个对象传递给一个函数并改变你的某个属性并且你可以访问那个函数之外的那些更改的值,那么我们就会猜测它是通过引用传递的,但实际上对于对象变量的值是一个参考

您无法使用JavaScript实际实现此目的,但您可以遵循简单的解决方法。如果您知道JavaScript中的每个对象都是Key of Key Value对的一种风格,那么索引器就可以访问所有变量。

在你的情况下,正如我所说的那样,变量的值是一个引用,并且它无意中改变它不会持久的值。而且您还知道当前的上下文(this)是global,因此您可以通过索引器访问变量并按名称更改值。

唯一的区别是,您将函数的名称作为字符串传递。

var carToy, trainToy;

function setToyValue(name, description, toy) {
    this[toy] = new makeToy(name, description);
}

function makeToy(name, description) {
    this.name = name;
    this.description = description;
}

function start() {
    setToyValue("toy car", "red, 4 wheels", "carToy");
    setToyValue("train car", "green, with 5 wagons", "trainToy");
    console.log(carToy);
    console.log(trainToy);
}

start();

在我看来,这是你能做的最好的事情。

答案 1 :(得分:1)

你不能这样做。 new会返回对其创建的新对象的引用,因此您应该从setToyValue返回该对象,并将其分配给start()中的变量。

var carToy, trainToy;

function setToyValue(name, description) {
    return new makeToy(name, description);
}

function makeToy(name, description) {
    this.name = name;
    this.description = description;
}

function start() {
    carToy = setToyValue("toy car", "red, 4 wheels");
    trainToy = setToyValue("train car", "green, with 5 wagons");
    console.log(carToy);
    console.log(trainToy);
}

start();