Как завершить скрипт в JavaScript? - PullRequest
117 голосов
/ 15 февраля 2009

Как выйти из сценария JavaScript так же, как PHP exit или die? Я знаю, что это не лучшая практика программирования, но мне нужно.

Ответы [ 16 ]

71 голосов
/ 15 февраля 2009

Эквивалент JavaScript для PHP die. Кстати, он просто вызывает exit() (спасибо splattne):

function exit( status ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Brett Zamir (http://brettz9.blogspot.com)
    // +      input by: Paul
    // +   bugfixed by: Hyam Singer (http://www.impact-computing.com/)
    // +   improved by: Philip Peterson
    // +   bugfixed by: Brett Zamir (http://brettz9.blogspot.com)
    // %        note 1: Should be considered expirimental. Please comment on this function.
    // *     example 1: exit();
    // *     returns 1: null

    var i;

    if (typeof status === 'string') {
        alert(status);
    }

    window.addEventListener('error', function (e) {e.preventDefault();e.stopPropagation();}, false);

    var handlers = [
        'copy', 'cut', 'paste',
        'beforeunload', 'blur', 'change', 'click', 'contextmenu', 'dblclick', 'focus', 'keydown', 'keypress', 'keyup', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'resize', 'scroll',
        'DOMNodeInserted', 'DOMNodeRemoved', 'DOMNodeRemovedFromDocument', 'DOMNodeInsertedIntoDocument', 'DOMAttrModified', 'DOMCharacterDataModified', 'DOMElementNameChanged', 'DOMAttributeNameChanged', 'DOMActivate', 'DOMFocusIn', 'DOMFocusOut', 'online', 'offline', 'textInput',
        'abort', 'close', 'dragdrop', 'load', 'paint', 'reset', 'select', 'submit', 'unload'
    ];

    function stopPropagation (e) {
        e.stopPropagation();
        // e.preventDefault(); // Stop for the form controls, etc., too?
    }
    for (i=0; i < handlers.length; i++) {
        window.addEventListener(handlers[i], function (e) {stopPropagation(e);}, true);
    }

    if (window.stop) {
        window.stop();
    }

    throw '';
}
56 голосов
/ 28 августа 2011

Функции «выхода» обычно выходят из программы или скрипта вместе с сообщением об ошибке в качестве параметра. Например die (...) в php

die("sorry my fault, didn't mean to but now I am in byte nirvana")

Эквивалентом в JS является сообщение об ошибке с помощью ключевого слова throw , например:

throw new Error();

Вы можете легко проверить это:

var m = 100;
throw '';
var x = 100;

x
>>>undefined
m
>>>100
44 голосов
/ 28 сентября 2011

Даже в простых программах без дескрипторов, событий и тому подобного лучше всего поместить код в «основную» функцию, даже если это единственная процедура:

<script> 
function main()
{
//code

}
main();
</script>

Таким образом, когда вы хотите остановить программу, вы можете использовать «return».

8 голосов
/ 12 апреля 2018

Существует много способов для выхода из сценария JS или Node. Вот наиболее актуальные:

// This will never exit!
setInterval((function() {  
    return;
}), 5000);

// This will exit after 5 seconds, with signal 1
setTimeout((function() {  
    return process.exit(1);
}), 5000);

// This will also exit after 5 seconds, and print its (killed) PID
setTimeout((function() {  
    return process.kill(process.pid);
}), 5000);

// This will also exit after 5 seconds and create a core dump.
setTimeout((function() {  
    return process.abort();
}), 5000);

Если вы находитесь в REPL (т.е. после запуска node в командной строке), вы можете набрать .exit для выхода.

6 голосов
/ 19 сентября 2017

Если вам все равно, что это ошибка, просто напишите:

fail;

Это остановит ваш основной (глобальный) код. Полезно для некоторых аспектов отладки / тестирования.

3 голосов
/ 19 марта 2017

Поместите ключевое слово debugger; в свой код JavaScript, где вы хотите остановить выполнение. Затем откройте инструменты разработчика вашего любимого браузера и перезагрузите страницу. Теперь он должен остановиться автоматически. Откройте раздел инструментов Sources : ключевое слово debugger; выделено, и у вас есть возможность возобновить выполнение скрипта.

Надеюсь, это поможет.

Дополнительная информация по адресу:

1 голос
/ 22 августа 2017

В моем случае я использовал API window.stop, который похож на нажатие кнопки X в вашем браузере:

window.stop();
1 голос
/ 14 апреля 2017

В этом ответе приводятся подробности, демонстрирующие дополнительную структуру, которая поможет решить эту и другие проблемы раннего выхода, исключений, управления процессом и последовательной обработки функций в модульных JavaScript-сценариях. Решение предоставляет примеры закрытия. Этот ответ предполагает, что индивидуум хотел бы, чтобы другие сценарии на странице продолжали выполняться после выхода из указанного сценария.

Живой пример простого решения здесь: https://codepen.io/corpus_khu/pen/VpMQzO

<script>
    var safetyRun = (function(){
      var curExecution = null;
      var exceptionHandlers = {
        cleanup:function(){
          /*do exit cleanup*/
          console.log("Cleanup could set straglers to {}");
          return;
        }
      }
      var exitErr = function(errcode){
        curExecution.exNames.push("cleanup");
        throw new Error("EarlyExit");
      }
        var run = function(fun){
          curExecution = this;
          curExecution.exNames = [];
          fun(exitErr);
          for ( x in exNames){
            exceptionHandlers[x]();
          }
          return;
        }
        return run;
    })();
    var exitThisScript = function(exit){
      //write some modular code
      console.log("before exit");
      exit();
      console.log("after exit");
      return;
    }
    safetyRun(exitThisScript);
</script>

Выше очень простой способ выхода. Перед отправкой вашей функции этому «Бегунку» я рекомендую обернуть вашу функцию в тестовом жгуте, обернув объект, который загружает жгут и может быть выполнен; тестовый жгут должен предоставлять такие методы, как exit (), чтобы они не имели быть переданным.

Примеры всего, что вам нужно для построения хорошей стратегии выхода, доступны на github здесь (file: pseudo_threads2.js): https://github.com/fromSpace/js-recursionwithevents-practice

Демо-версия здесь: https://fromspace.github.io/js-recursionwithevents-practice/

Обратите внимание, что в pseudo_threads2.js функция simConstantMomentum () возвращает функцию, имеющую лексические переменные области видимости со всеми функциями использования. Вместо этого я рекомендую вам вызвать генератор жгута в верхней части этой функции и присвоить его результат локальной переменной, чтобы функция, которую вы хотите выйти, выглядела больше так, когда вы закончите.

var rockStarFunction = new function (){
var harness = reducePublicStrapOnFromCache()._url(location);
return function(){
        harness.scriptContextChangeEvent();
        harness.imInteligentFunction("{slib_err-15346 : 'Cannot handle request, ::suggest(mesh//abc) exit back to pool'}");
        harness.exit();
        console.log("You should never get this far");
        return true;
    };
}

Решение, которое я здесь предоставил, - это то, которое я рекомендую, если вы намереваетесь построить контейнер для запуска javascript с такими встроенными возможностями, как exit, assert, mock и тому подобное. Я думаю, что это лучший способ построить этот контейнеровоз и сделать мои функции передаваемыми. - corpus_khu

0 голосов
/ 29 мая 2019

Если вы используете любую неопределенную функцию в скрипте, тогда скрипт остановится из-за "Uncaught ReferenceError". Я попытался с помощью следующего кода и первые две строки выполнены.

Я думаю, это лучший способ остановить сценарий. Если есть другой способ, пожалуйста, прокомментируйте меня. Я также хочу знать другой лучший и простой способ. Кстати, я не получил выход или умереть встроенную функцию в Javascript, как PHP для завершения сценария. Если кто-то знает, пожалуйста, дайте мне знать.

alert('Hello');

document.write('Hello User!!!');

die();  //Uncaught ReferenceError: die is not defined

alert('bye');

document.write('Bye User!!!');
0 голосов
/ 20 мая 2019

Я думаю, что на этот вопрос был дан ответ, нажмите здесь для получения дополнительной информации. Ниже приведен краткий ответ, который он опубликовал.

throw new Error("Stop script");

Вы также можете использовать свой браузер для добавления точек останова, каждый браузер похож, проверьте информацию ниже для своего браузера.

Для получения информации о точках останова Chrome нажмите здесь
Для получения информации о точках останова Firefox нажмите здесь
Для информации о точках останова Explorer нажмите
Для получения информации о точках останова Safari нажмите здесь

...