2015-11-04 3 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 (функция, которая называет себя), вызвав window.moveBy внутри вашей moveBy функции без указания точки останова или выход случай:

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. 
} 

Может быть, что вы хотите использовать другое имя для функции и вызвать фактические 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() функцию myMoveBy() или лучше openAndMoveBy()

1

Проблема в том, что вы вызываете функцию moveBy внутри Funtion 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>