2010-01-15 3 views
1

Я действительно не уверен, что это возможно в Javascript. Вот моя функция:Область Javascript и локальные переменные

var tree = function(name, callback) { 
    if (this.name) { 
    this.name.push(name) 
    print(this.name) 
    } else { 
    this.name = [] 
    } 
    callback() 
} 

Я хотел бы использовать его как следует и распечатать иерархию:

tree("john", function() { 
    tree("geoff", function() { 
    tree("peter", function() { 
     tree("richard", function() { 
     }) 
    }) 
    }) 
    tree("dave", function() { 
    }) 
}) 

Вот желаемый результат:

// ['john'] 
// ['john', 'geoff'] 
// ['john', 'geoff', 'peter'] 
// ['john', 'geoff', 'peter', 'richard'] 
// ['john', 'dave'] 

, но, к сожалению, я получение

// ['john', 'geoff', 'peter', 'richard', 'dave'] 

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

Сердечные приветы

Adam рощами

+0

Вы пытаетесь получить желаемый результат, не изменяя функцию дерева или не изменяя способ, которым вы его вызываете? – sberry

+1

Вы просто заботитесь о внешности печатного выхода или результирующей структуры массива? Кроме того, с отсутствием оператора 'new' вы знаете, что' this' относится к 'window', да? –

+0

Я был бы рад изменить функцию дерева, но скорее не изменил бы способ ее вызова. Извините за отложенный ответ - я в Европе. – 2010-01-16 07:45:45

ответ

2

Причина, почему последняя строка печатает все имена, потому что this.names никогда не удаляя имена, которые добавляются к нему. Вы просто добавляете имена на него. Таким образом, когда вызов функции производится

callback() 

со значением

function() { 
    tree("richard", function() { 
}) 

this.names = [ 'Джон', 'Geoff', 'питер'] и после вызова это. names = ['john', 'geoff', 'peter', 'richard']. Так что теперь, когда вы звоните

tree("dave", function() { 
}); 

this.names еще [ 'Джон', 'Geoff', 'питер', 'ричард'].

Попробуйте следующие вместо этого, и заметьте, что я изменил this.name к this.names, чтобы легче читать.

var tree = function(name, callback) { 
    if (!this.names) { 
    this.names = []; 
    } 
    this.names.push(name); 
    print(this.names); 
    callback(); 
    this.names.pop(); 
} 
+0

Блестящий! Только то, что мне нужно. – 2010-01-19 11:17:54

1

Я не уверен, что обратного вызова делает, но вы, вероятно, следует использовать применить() или вызова() при вызове его.

callback.apply(this, arguments); 
+0

Обратный вызов - это просто «дерево» функции, которое снова передается самому себе. – 2010-01-16 07:44:38

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