Javascript 为什么此函数在运行时会出现错误,但在复制到控制台时不会出现错误?
我通常试图避免发布大而混乱的代码块,但如果我将脚本复制到控制台,我真的不明白为什么这个脚本工作得很好,但是如果我将它全部包装在一个函数中,然后调用该函数,我会得到错误,动画没有定义Javascript 为什么此函数在运行时会出现错误,但在复制到控制台时不会出现错误?,javascript,jquery,Javascript,Jquery,我通常试图避免发布大而混乱的代码块,但如果我将脚本复制到控制台,我真的不明白为什么这个脚本工作得很好,但是如果我将它全部包装在一个函数中,然后调用该函数,我会得到错误,动画没有定义 var animation; var e; var myPath; var paper = Raphael(document.getElementById('svgArea'), 600, 400); e = paper.circle(106.117, 82.076, 5, 5).attr({ stroke:
var animation;
var e;
var myPath;
var paper = Raphael(document.getElementById('svgArea'), 600, 400);
e = paper.circle(106.117, 82.076, 5, 5).attr({
stroke: "none",
fill: 'red'
});
var path = 'M106.117,82.076c0,0,227.487-121.053,183.042,22.222c-44.445,143.275-95.322,83.041-95.322,83.041L106.117,82.076z';
myPath = paper.path(path).attr({
stroke: 'black',
"stroke-width": 2,
"stroke-opacity": 0.2
});
animation = setInterval("animate()", 10); //execute the animation function all 10ms (change the value for another speed)
var counter = 0; // a counter that counts animation steps
function animate() {
if (myPath.getTotalLength() <= counter) { //break as soon as the total length is reached
counter = 0;
}
var pos = myPath.getPointAtLength(counter); //get the position (see Raphael docs)
e.attr({
cx: pos.x,
cy: pos.y
}); //set the circle position
counter++; // count the step counter one up
};
var动画;
变量e;
var-myPath;
var paper=Raphael(document.getElementById('svgArea'),600400);
e=纸张圆(106.117,82.076,5,5).attr({
笔画:“无”,
填充:“红色”
});
变量路径='M106.117,82.076c0,0227.487-121.053183.042,22.222c-44.445143.275-95.322,83.041-95.322,83.041L106.117,82.076z';
myPath=paper.path(path).attr({
笔画:“黑色”,
“笔划宽度”:2,
“笔划不透明度”:0.2
});
动画=设置间隔(“动画()”,10)//在10毫秒内执行动画功能(更改其他速度的值)
变量计数器=0;//计数动画步数的计数器
函数animate(){
如果(myPath.getTotalLength(),则settimeout调用会在您将其作为字符串传递时从animate调用中移除作用域。当animate是全局的时,这并不重要,但一旦包含在函数中,它就会移除。如果在函数中关闭animate调用,它仍然会引用animate,并且应该可以工作
animation = setInterval(function(){ animate(); }, 10);
settimeout调用在作为字符串传递时从animate调用中删除作用域。当animate是全局的时,这并不重要,但一旦包含在函数中,它就会这样做。如果在函数中关闭animate调用,它仍然会引用animate,并且应该可以工作
animation = setInterval(function(){ animate(); }, 10);
@Coin_op回答的另一种方法是传递函数引用
animation = setInterval(animate, 10);
@Coin_op回答的另一种方法是传递函数引用
animation = setInterval(animate, 10);
如果将所有代码包装在一个函数中,则animate
函数是外部函数的本地函数。setInterval
将尝试在全局范围内查找animate
函数,但找不到。如果将所有代码包装在一个函数中,则animate
函数是外部函数的本地函数。setInterval将尝试在全局范围内查找动画
函数,但找不到。setInterval(动画,10)如果您不需要将任何参数传递给animae
Fair point,则
更简单。函数包装器只是提供了更大的灵活性。如果您需要传递参数,则包装器可以工作-这里不是这种情况,但值得注意。添加不需要的函数包装器会鼓励复制粘贴编程,这是cargo cult程序的一种形式我认为这是一件坏事。setInterval(动画,10)如果您不需要将任何参数传递给animae
Fair point,则
更简单。函数包装器只是提供了更大的灵活性。如果您需要传递参数,则包装器可以工作-这里不是这种情况,但值得注意。添加不需要的函数包装器会鼓励复制粘贴编程,这是cargo cult程序的一种形式我认为这是一件坏事。是的,否则这是一个隐含的评估。是的,否则这是一个隐含的评估。