Javascript 为什么事件侦听器回调函数只在函数范围内工作?

Javascript 为什么事件侦听器回调函数只在函数范围内工作?,javascript,d3.js,Javascript,D3.js,我正在做一个D3项目,它使用一个事件监听器,每隔几毫秒就会调用它来更新/动画屏幕上圆圈的位置 首先调用函数startForces(),以激活D3力,然后将其传递给圆 当回调函数(勾选)位于startForces()范围之外时,该函数似乎只调用一次,并且圆在页面上显示为静态。(请参见顶部代码块) 但是,当回调函数(勾选)位于startForces()的作用域内时,一切都按预期工作,圆圈显示为动画。(底部代码块) 我试图理解为什么javascript是这样工作的。为什么顶部代码不起作用,而底部代码起

我正在做一个D3项目,它使用一个事件监听器,每隔几毫秒就会调用它来更新/动画屏幕上圆圈的位置

首先调用函数startForces(),以激活D3力,然后将其传递给圆

当回调函数(勾选)位于startForces()范围之外时,该函数似乎只调用一次,并且圆在页面上显示为静态。(请参见顶部代码块)

但是,当回调函数(勾选)位于startForces()的作用域内时,一切都按预期工作,圆圈显示为动画。(底部代码块)

我试图理解为什么javascript是这样工作的。为什么顶部代码不起作用,而底部代码起作用

TL:DR 非工作代码 =====

工作代码
为什么会有差异?

实际上与函数的位置无关

执行此操作时:

.on('tick',tick(圆圈))

在侦听器上创建
时,您立即调用勾选的
右键。然后,将
勾选
的回调指定为使用圆圈调用
勾选
的结果,即
未定义

执行此操作时:

.on('tick',ticked)


您将回调指定为勾选的
函数,这是您想要的。

谢谢!把我的头绕在它周围,但它开始有意义了。是的,这让很多人都被绊倒了!请记住,
ticked(圆圈)
的计算值未定义,但
ticked
的值是函数本身。您想将函数分配给回调,而不是它的返回值。@Starcat只需将我的两分钱添加到DayTurns的答案中即可:通常,力模拟中的
勾选
函数不需要参数。但是,如果出于某种原因确实需要将任何参数传递给它,请将其包装在匿名函数中:
on('tick',function(){ticked(foo)})
var ticked = function(circles){
   circles.attr('cx', function(d) { return d.x })
   .attr('cy', function(d) { return d.y })
}

var startForces = function(data, circles) {
  simulation.nodes(data)
  .on('tick', ticked(circles))
}
    var startForces = function(data, circles) {
      simulation.nodes(data)
      .on('tick', ticked)

    function ticked(){
      circles.attr('cx', function(d) { return d.x })
      .attr('cy', function(d) { return d.y })
    }
   }