Javascript范围和局部变量

时间:2010-01-15 22:58:55

标签: javascript function variables scope

我真的不确定这是否可以在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 Groves

2 个答案:

答案 0 :(得分:2)

最后一行打印所有名称的原因是因为 this.names 永远不会删除添加到它的名称。你只需要在其上添加名称。所以当进行函数调用时

callback()  

的值为

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

this.names = ['john','geoff','peter'] 并在致电 this.names = ['john','geoff','peter'之后,'richard'] 。所以现在当你打电话

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 :(得分:1)

我不确定回调是做什么的,但是当你调用它时你应该使用apply()或call()。

callback.apply( this, arguments );