Javascript 函数表达式参数未指定值,但具有值

Javascript 函数表达式参数未指定值,但具有值,javascript,canvas,parameters,function-expression,Javascript,Canvas,Parameters,Function Expression,我希望有人能解释下面的函数表达式是如何工作的。尚未为参数“p”赋值,但它在函数体中用于计算(定义“角度”和“尾部”变量),并在调用draw()时用作参数对象。当您逐步浏览代码时,您可以看到参数“p”确实有一个值(请参见附图)——但我不明白该值来自何处。请注意,在审查完整代码时,没有在其他任何地方注明“p” 将“p”登录到控制台时,您会看到以下值,这些值会随着应用程序的运行而不断增加: 下面是完整的函数表达式和函数调用: var draw = function(p) {  $.fillSty

我希望有人能解释下面的函数表达式是如何工作的。尚未为参数“p”赋值,但它在函数体中用于计算(定义“角度”和“尾部”变量),并在调用draw()时用作参数对象。当您逐步浏览代码时,您可以看到参数“p”确实有一个值(请参见附图)——但我不明白该值来自何处。请注意,在审查完整代码时,没有在其他任何地方注明“p”

将“p”登录到控制台时,您会看到以下值,这些值会随着应用程序的运行而不断增加:

下面是完整的函数表达式和函数调用:

var draw = function(p) { 
  $.fillStyle = "hsla(38,5%,12%,.90)";
  $.fillRect(0, 0, w, h); 
  $.fillStyle = "hsla(38, 25%, 90%, 1)"; 
  $.strokeStyle = "hsla(38, 25%, 90%, 1)";
  for (var i = 0; i < numh; i++)
    for (var j = 0; j < numw; j++) {
      var diagnalW = j * spacing +
        (i % 2 ? 0 : spacing / 2);
      var diagnalH = i * spacing;
      var arr = [position[0] - diagnalW,
          position[1] - diagnalH
        ],
        wave = Math.sqrt(arr[0] * arr[0] +
          arr[1] * arr[1]),
        arr = [arr[0] / wave, arr[1] / wave],
        angle = 50 * (Math.cos(p / 360 - wave / 105) - 1);
      $.beginPath();
      $.arc(diagnalW + arr[0] * angle, diagnalH +
        arr[1] * angle, 2.8, 0, 2 * Math.PI, false);
      $.closePath();
      $.fill();
      for (var n = 0; n < 5; n++) {
        var tail = 50 * (Math.cos((p - 50 * n) /
          360 - wave / 105) - 1);
        $.beginPath();
        $.moveTo(diagnalW + arr[0] * angle, diagnalH +
          arr[1] * angle);
        $.lineWidth = 5 - n;
        $.lineTo(diagnalW + arr[0] * tail, diagnalH + arr[1] * tail);
        $.stroke()
      }
    }
};

var anim = function(p) {
  window.requestAnimationFrame(anim);
  draw(p);
};
anim();
var draw=函数(p){
$.fillStyle=“hsla(38,5%,12%,0.90)”;
$.fillRect(0,0,w,h)
$.fillStyle=“hsla(38,25%,90%,1)”
$.strokeStyle=“hsla(38,25%,90%,1)”;
对于(var i=0;i
除了“p”如何获得控制台中显示的值之外,我了解关于这段代码的所有内容。另外,如果不清楚,这是一个html5画布应用程序


(旁注:不,
$
在上面不是jQuery。这正是原始作者用于画布上下文对象的内容。)

第一次调用
draw
时,
p
将具有
未定义的值,因为
anim()
没有传递
p
的值,而
anim
则在调用
draw
时使用
p


之后,
draw
由浏览器调用,而不是由该代码调用,因为它被用作的回调。浏览器将使用高分辨率计时器值调用它,这是您在
p
中看到的第一次调用
draw
p
将具有未定义的
值,因为
anim()
不会传递
p
的值,而
anim
则在调用
draw
时使用
p


之后,
draw
由浏览器调用,而不是由该代码调用,因为它被用作的回调。浏览器将使用高分辨率计时器值调用它,这是您在
p

中看到的
p
是的回调参数

一个参数,指定在下次重新绘制时更新动画时要调用的函数。回调只有一个参数a,它指示
requestAnimationFrame
开始触发回调的当前时间(从中返回的时间)


p
是的回调参数

一个参数,指定在下次重新绘制时更新动画时要调用的函数。回调只有一个参数a,它指示
requestAnimationFrame
开始触发回调的当前时间(从中返回的时间)


哦这很有道理。非常感谢你。很抱歉之前对我的帖子感到困惑。不幸的是,我不能对你的回答投赞成票,因为这是一个新的帐户,但你的回答太棒了。再次感谢@米歇尔:很高兴这有帮助!几分钟后,你可以接受一个答案(我的或尼娜的,或者如果有更好的答案被贴出来…)。再来一点,就行了!再次感谢!哦这很有道理。非常感谢你。很抱歉之前对我的帖子感到困惑。不幸的是,我不能对你的回答投赞成票,因为这是一个新的帐户,但你的回答太棒了。再次感谢@米歇尔:很高兴这有帮助!几分钟后,你可以接受一个答案(我的或尼娜的,或者如果有更好的答案被贴出来…)。再来一点,就行了!再次感谢!非常感谢你。这个答案与上面T.J.的答案一致。非常感谢,非常感谢。这个答案与上面T.J.的答案一致。非常感谢。