2011-11-25 117 views
2

我在想如何通过传递函数作为参考来初始化变量。下面是代码:通过在函数上传递引用来初始化变量

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/

回答

4

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

您实际上无法使用JavaScript实现此目的,但您可以使用简单的解决方法。如果您知道JavaScript中的每个对象都是“关键值对字典”的风格,并且索引器可以访问所有变量。

就你的情况而言,正如我所说的那样,变量的值是一个引用,它没有意义改变它不会持续的值。而且您还知道您当前的上下文(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(); 
+0

嗯,我明白了。在这种情况下,我正在使用start来初始化这两个变量。但我想要的是有一个函数来初始化任何传递的变量,比如我用_ set_value_tried_。 换句话说,在你的答案中,我设置了carToy和trainToy,但在我的实际应用程序中,我需要的是初始化传递给“start()”的变量,比方说。没有办法做到这一点? 对不起,如果我没有清楚地解释我自己...我会尝试重新制定,如果我混乱。 –