Как завершить скрипт в JavaScript?

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

Ответ 1

JavaScript-эквивалент для PHP die. BTW он просто вызывает 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 '';
}

Ответ 2

"Выход" обычно закрывают программу или script вместе с сообщением об ошибке как параметром. Например, 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

Ответ 3

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

<script> 
function main()
{
//code

}
main();
</script>

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

Ответ 4

Есть много способов выйти из сценария 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 для выхода.

Ответ 5

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

fail;

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

Ответ 6

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

Я надеюсь, что это помогает.

Больше информации на:

Ответ 7

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

window.stop();

Ответ 8

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

Живой пример простого решения здесь: https://jsfiddle.net/alignedfibers/cpe1o1yy/66/

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

Выше "CallRunner", который предоставляет очень простой способ бесплатно выйти, просто передав свою функцию бегуну.

Именование переменных в скрипте может сбивать с толку, функция с именем "fun" - это имя, используемое в safetyRun для ссылки на функцию, которую мы пытаемся выйти, а exitErr - это имя, используемое для ссылки на функцию, которую мы запускаем для фактического завершения выхода. Также немного сбивает с толку: после завершения exitErr кадр стека все еще не освобождается из потока управления, который вызвал функцию, которую мы вышли. Поскольку у нас все еще есть поток управления, мы можем использовать функции или коды ошибок, помещенные в массив в функции exitErr, и вызывать их итеративно, прежде чем вернуться, чтобы разрешить выполнение любых других функций. Это позволяет нам изменять любые веса, вносить исправления или устанавливать любое необходимое состояние, которое мы можем использовать, чтобы предупредить о том, какие состояния исправления ошибок требуют внимания, отправить отчет журнала или даже завершить сложную очистку и автономно исправить функцию в фоновом режиме и итеративно вызвать exitErr пока он не завершит возврат вместо броска, что позволит функции, которую мы пытаемся завершить досрочно, завершиться (предложите сделать это вне основного потока). Эта "обертка/жгут" может быть хорошим способом проверки версий браузера и прочего в начале функции, вы даже можете выполнить статический или динамический импорт здесь, если вы управляете своими собственными библиотеками или чем-то, о чем вы действительно можете подумать. Выход - это только одна фундаментальная функция, которую можно сделать доступной для вашей функции, обернув ее так.

Код в скрипте немного грязный и не очень красивый, новые конструкции es6 могут сделать это красивее. Кроме того, я рекомендую вам вызвать генератор жгута вверху этой функции и присвоить его результат локальной переменной, чтобы функция, которую вы хотите завершить, выглядела больше как приведенный ниже код. Чтобы сохранить поток управления без освобождения стека, вам все равно понадобится файл harness.run (функция (harness) {/MyVanillaFunc/}), чтобы обернуть вашу ванильную функцию, в противном случае теоретически должно работать приведенное ниже. Обтекание - именно то, что я сделал в коде exitEarly выше.

var rockStarFunction = new function (){
var harness = reducePublicStrapOnFromCache()._url(location);
return function(){ /*wrapper would wrap these internals*/
        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 и тому подобное. Я думаю, что это лучший способ построить этот контейнеровоз и сделать мои функции передаваемыми.

Ответ 9

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

Обратите внимание, что на практике большинство интерпретаторов Javascript для браузеров просто перестают запускать текущий script, если они столкнутся с ошибкой. Таким образом, вы можете сделать что-то вроде доступа к атрибуту неустановленной переменной:

function exit() {
    p.blah();
}

и он, вероятно, прервет script. Но вы не должны рассчитывать на это, потому что это вовсе не стандарт, и это действительно кажется ужасной практикой.

EDIT: Хорошо, может быть, это был не такой хороший ответ в свете Олафура. Хотя функция die(), с которой он связан, в основном реализует мой второй абзац, то есть он просто выдает ошибку.

Ответ 10

UPDATE: Это работает до тех пор, пока вы не catch его!

throw window.location.assign('dead.html');

Ответ 11

Эта маленькая функция очень похожа на PHP exit(). Как и с другими решениями, больше ничего не добавляйте.

function exit(Msg)
    {
    Msg=Msg?'*** '+Msg:'';
    if (Msg) alert(Msg);
    throw new Error();
    } // exit

Ответ 12

Просто создайте условие BOOL, здесь нет необходимости в сложном коде.

Если даже если вы включите его в true/или несколько раз, он даст вам одну линию решения/не несколько - в основном просто.

Ответ 13

бросить "";

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

Вдобавок к этому: вам нужна страница, которая сообщает вам по электронной почте, как только она выдается - вы можете использовать, например, Raven/Sentry для этого. Но это означает, что вы производите ложные срабатывания. В таком случае вам также необходимо обновить обработчик по умолчанию, чтобы отфильтровывать такие события или устанавливать такие события на игнорирование на панели мониторинга Sentry.

window.stop();

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

отладчик;

Останавливает выполнение только при открытом отладчике. Прекрасно работает, но не доставляется.

Ответ 14

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

throw new Error("Stop script");

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

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

Ответ 15

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

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

alert('Hello');

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

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

alert('bye');

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

Ответ 16

я использую этот кусок кода, чтобы остановить выполнение:

throw new FatalError("!! Stop JS !!");

вы получите ошибку консоли, но она хорошо работает для меня.

Ответ 17

Это пример того, что, если условие существует, то завершите script. Я использую это в javascript на стороне клиента SSE, если

<script src="sse-clint.js" host="https://sse.host" query='["q1,"q2"]' ></script>

canot анализируется прямо из анализа JSON...

if( ! SSE_HOST  ) throw new Error(['[!] SSE.js: ERR_NOHOST - finished !']);

... в любом случае общая идея такова:

if( error==true) throw new Error([ 'You have This error' ,  'At this file', 'At this line'  ]);

это закончит/умрет ваш javasript script

Ответ 18

я использую оператор return вместо throw, поскольку throw выдает ошибку в консоли. лучший способ сделать это - проверить состояние

if(condition){
 return //whatever you want to return
}

это просто останавливает выполнение программы из этой строки, вместо того, чтобы выдавать какие-либо ошибки в консоли.