2009-10-02 10 views
0

Я хотел бы объявить некоторые переменные, а затем позволить функции строить фактические объекты и назначать их ссылку на эти ранее объявленные переменные.Javascript - Установить значение переменной внутри функции

То, как я делаю это сейчас, работает, но оно становится утомительным со многими переменными.

function bar(obj) { 
    var newObject = {'an':'object'}; 
    obj['element'] = newObject; 
} 

function foo() { 
    var ref={}; 
    bar(ref); 
    ref=ref.element; // Tedious line 
} 

Для тех, кому интересно, почему я хотел бы сделать такую ​​вещь, я построил простую функцию для создания DOM из JSON. Само собой что-то подобное, с #bind используется, чтобы сделать то, что делает bar в предыдущем фрагменте кода:

var legend = {}; 
$('#element').append(['form',['fieldset', 
    ['legend',{'#bind':legend},['text':'Legend title']] 
    ]].getDomForThis()); 
legend=legend.element; 

Теперь я могу дописать новые элементы после легенды с чем-то вроде

for(fieldName in fields) { 
    legend.insertAfter(['div',[['input',['name':fieldName]],...]].getDomForThis()); 
} 

Я хотел бы чтобы избежать необходимости писать утомительную линию. Это как createElement и appendChild, одного вызова функции должно быть достаточно!

ОБНОВЛЕНИЕ: После некоторой мысли, я считаю, что нет возможности сделать это с помощью Javascript. Я надеялся на какую-то скрытую магию Javascript где-то, но у меня есть причина думать, что этого не произойдет.

В принципе, я бы хотел присвоить переменной ссылку новое значение, не создавая новую ссылку. Но аргумент функции a отличается от переменной v, которую он представляет. Указанный объект один и тот же, но адрес двух переменных отличается. Следовательно, присвоение нового значения a не может каким-либо образом изменить значение v.

Другими словами, каждая переменная имеет свой собственный адрес, и нет другого способа изменить то, на что она указывает, чем ссылаться на нее явно.

И в моем случае, поскольку ref является «закрытым» для функции, нет доступа к нему из другого места.

Слишком плохо ...

+0

Я ошибаюсь или «ref = ref.element;» в вашем первом примере следует читать «ref = obj.element;» ? – MaxiWheat

+1

И не должен ли бар (obj) в том же месте быть баром (ref)? – epascarello

+0

вправо, я колебался между ними. Исправлена. – Gzorg

ответ

1

Поскольку нет ByRef в JavaScript, ваш код и следующие такие же

function bar(obj) { 
    return {'an':'object'}; 
} 

function foo() { 
    var obj = {}; 
    obj.element = bar(); 
} 

Тем не менее, вы можете сделать что-то похожее на это:

function Foo() {   
    this.that = this, 
    this.obj = {}; 
    this.bar = function() { 
     var newObject = {'an':'object'}; 
     that.obj['element'] = newObject; 
    } 

    return this; 
} 

var f = Foo(); 

f.obj['foo'] = 'BAR'; 
f.bar(); 
console.log(f.obj.element.an); 
+0

Спасибо, что ответили, но я не понимаю. В моем примере obj заканчивается равным {'an': 'object'}, а в вашем, obj, в концах foo, равно {'element': {'an': 'object'}} , что, следовательно, не эквивалентно. – Gzorg

Смежные вопросы