Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么此函数在运行时会出现错误,但在复制到控制台时不会出现错误?_Javascript_Jquery - Fatal编程技术网

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程序的一种形式我认为这是一件坏事。是的,否则这是一个隐含的评估。是的,否则这是一个隐含的评估。