Инициализируйте переменную, передав ссылку на функцию - PullRequest
2 голосов
/ 25 ноября 2011

Мне интересно, как вы могли бы инициализировать переменную, передав ее в качестве ссылки на функцию.Вот код:

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 ]

4 голосов
/ 25 ноября 2011

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 голос
/ 25 ноября 2011

Вы не можете сделать это таким образом. 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();
...