2015-11-04 115 views
1

在下面的代码中,无论何时点击提交按钮,多个窗口都会以无限循环方式打开。如果我取消注释警报,那么多个警报会像无限循环一样弹出。为什么会发生这种情况?为什么我的JavaScript代码进入无限循环?

<html> 
<head> 

<script type = "text/javascript"> 
    var window; 

    function moveBy() { 
     //alert("-- hello ---"); 
     window = window.open("http://www.w3schools.com"); 
     window.moveBy(10, 20); 
    } 
</script> 


</head> 
<body> 
<input type = "submit" value = "moveBy" onclick = "moveBy()"> </input> 
</body> 
</html> 
+6

您有一个三线功能,不能明白为什么它的无限循环? – j08691

+1

当你在全局范围内声明一个函数时,它会附加到浏览器中的window对象。也就是说,你创建一个名为'moveBy'的函数,然后在其内部调用它。 – doogle

+0

你不能给'window'分配一个新的值。 'window = ....'不会改变'window'的值,所以你函数最后一行的'window'仍然是全局'window'对象。 – JLRishe

回答

3

您正在创建一个recursion(函数调用自身)或退出案例:

function moveBy() { 
    //alert("-- hello ---"); 
    window = window.open("http://www.w3schools.com"); 
    window.moveBy(10, 20); //recursion, it will call this function over and over again. 
} 

也许你想要的是使用另一种名称为您的功能,并与prede调用实际window.moveBy内罚款参数:

function customMoveBy() { 
    //alert("-- hello ---"); 
    window = window.open("http://www.w3schools.com"); 
    window.moveBy(10, 20); 
} 

<input type = "submit" value = "moveBy" onclick = "customMoveBy()"> </input> 
7

因为你自己调用函数moveBy

8

Javascript不支持方法重载,所以通过调用window.moveBy(10, 20);实际上你基本上再次调用moveBy(),导致无限循环。从本身调用函数称为recursion。链接的帖子是一个很好的阅读这个话题,并会指导你在哪里可能想要它。但在你的情况下,你显然不会。

请仔细阅读this文章。

为了防止这种情况发生,您可以将您的moveBy()函数调用window.moveBymoveBy函数中不说明一个破发点重命名为myMoveBy()或更好openAndMoveBy()

1

的问题是,您所呼叫的funtion moveBy内部功能moveBy。当你执行你一次又一次地调用它的函数...

试试这个:

<html> 
<head> 

<script type = "text/javascript"> 
    var window; 

    function moveBy() { 
     alert("-- hello ---"); 
     window = window.open("http://www.w3schools.com"); 
     //window.moveBy(10, 20); 
    } 
</script> 


</head> 
<body> 
<input type = "submit" value = "moveBy" onclick = "moveBy()"> </input> 
</body> 
</html>