Область применения Javascript и локальные переменные - PullRequest
1 голос
/ 16 января 2010

Я действительно не уверен, возможно ли это в 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']

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

С уважением

Адам Гровс

Ответы [ 2 ]

2 голосов
/ 17 января 2010

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

callback()  

со значением

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

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

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

this.names по-прежнему ['john', 'geoff', 'peter', 'richard'] .

Попробуйте вместо этого следующее, и обратите внимание, что я изменил 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();
}  
1 голос
/ 16 января 2010

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

callback.apply( this, arguments );
...