2015-11-04 113 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>