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

149

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

Nir
источник
1
Как вы думаете, вы могли бы расширить это требование, именно поэтому вы пытаетесь достичь этого?
andynormancx
8
@andynormancx, это может быть удобно для отладки.
SET
3
просто return;может быть достаточно в зависимости от ваших требований, действует как die () без параметров.
Исикава
2
Если вам это «нужно», вам лучше переосмыслить свой дизайн.
Фрунги
18
почему всегда первый вопрос «почему»?
Джон Ктеджик

Ответы:

80

Эквивалент JavaScript для PHPdie . Кстати, это просто звонки 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 '';
}
Олафур Вааге
источник
1
Вот исходный код выхода: kevin.vanzonneveld.net/techblog/article/…
splattne
Этот код не останавливает события на элементах, а только события окна. Так что вам также нужно перебрать все элементы на странице, делая что-то похожее. Все это звучит как очень странное требование.
andynormancx
2
вся концепция кристалла немного нарушена - поток должен быть способен обрабатывать любые и все возможные ситуации, независимо от того, требуется ли это попробовать или нет.
Annakata
Я думаю, что вы не включили все события, которые должны быть обработаны, такие как событие "selectstart".
Оно Оогами
4
Вы не можете остановить обработчики XMLHttpRequest. Текущий код не останавливает выполнение интервалов или тайм-аутов. Демонстрация: jsfiddle.net/skibulk/wdxrtvus/1 Вы можете рассмотреть это как исправление: stackoverflow.com/a/8860203/6465140
skibulk
73

Функции «выхода» обычно выходят из программы или скрипта вместе с сообщением об ошибке в качестве параметра. Например умереть (...) в 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
Лоренц Ло Зауэр
источник
46
@Sydwell: Если вы окружите его блоком catch, он будет перехвачен, и программа не прекратит работу, игнорируя точку здесь.
окончательное
4
Не забывайте, что вы можете добавить сообщение об ошибке: throw new Error ('variable =' + x); Это хороший способ быстро завершить сценарий, пока вы работаете над ним, и получить значение переменной.
Эндрю Свифт
1
@ultimate Я думаю, что #Sydwell намеревается обернуть весь скрипт в try / catch, чтобы вы могли получить a) чистый выход b) возможное сообщение об исключении, когда это необходимо :) Бросание непереработанных исключений обычно не приносит пользы :)
jave.web
47

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

<script> 
function main()
{
//code

}
main();
</script>

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

Jhep
источник
15

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

fail;

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

Марк
источник
1
window.failне определено в текущих браузерах.
mikemaccana
8
В том-то и дело - вы тоже могли бы сделать mikeyMouse;- ошибка прекратится. Это быстро и грязно.
Марк
2
Ах, достаточно справедливо - может быть, добавить это к вашему ответу?
mikemaccana
13

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

not2qubit
источник
Я не хотел оскорблять интеллект читателей, объясняя аббревиатуру, которая появляется как первый результат его поиска в Google. Я предлагаю вам не смешивать код JavaScript с командами REPL, потому что если пользователь скопирует / вставит этот блок кода и выполнит его, он получит синтаксическую ошибку в строке «.exit».
Дан Даскалеску
6

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

window.stop();
Musa
источник
5

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

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

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

rbelow
источник
2

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

throw new Error("Stop script");

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

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

alfmonc
источник
1

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

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

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

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

РЕДАКТИРОВАТЬ : ОК, может быть, это не был хороший ответ в свете Олафура. Хотя die()функция, с которой он связан, в основном реализует мой второй абзац, то есть просто выдает ошибку.

Дэвид З
источник
1
Все, что будет делать, остановит выполнение текущего скрипта. Это не остановит новые события от запуска и запуска новых фрагментов скрипта.
andynormancx
Не говоря уже о том, что вам не нужна дополнительная плохая функция для выдачи ошибки. Javascript имеет встроенный оператор throw.
Крис
Функция die делает намного больше, чем ваша p.blah (), она проходит через события windows и заменяет имеющиеся у них дескрипторы на «e.preventDefault (); e.stopPropagation ();», что останавливает запуск событий. Тогда это исключение.
andynormancx
1

бросить "";

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

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

window.stop ();

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

отладчик;

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

informatik-handwerk.de
источник
1

В JavaScript есть несколько способов, ниже приведены некоторые из них

Способ 1:

throw new Error("Something went badly wrong!");

Способ 2:

return;

Способ 3:

return false;

Способ 4:

new new

Способ 5:

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

Примечание: если вы хотите просто приостановить выполнение кода, вы можете использовать

debugger; 
Srikrushna
источник
0

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

function exit(Msg)
    {
    Msg=Msg?'*** '+Msg:'';
    if (Msg) alert(Msg);
    throw new Error();
    } // exit
Дэвид Спектор
источник
0

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

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

Мони
источник
0

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

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

alert('Hello');

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

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

alert('bye');

document.write('Bye User!!!');
npsingh
источник
0

Если вы просто хотите остановить выполнение следующего кода без «выдачи» какой-либо ошибки, вы можете временно переопределить, window.onerrorкак показано в cross-exit:

function exit(code) {
    const prevOnError = window.onerror
    window.onerror = () => {
        window.onerror = prevOnError
        return true
    }

    throw new Error(`Script termination with code ${code || 0}.`)
}

console.log("This message is logged.");
exit();
console.log("This message isn't logged.");
Ричи Бендалл
источник
0

Я использую iobroker и легко удалось остановить скрипт с

stopScript();
user13449123
источник
0

Не применимо в большинстве случаев, но у меня было много асинхронных скриптов, запущенных в браузере, и как хак я

window.reload();

чтобы остановить все.

M3RS
источник
0

Я знаю, что это старый, но если вы хотите подобную die()функцию PHP , вы можете сделать:

function die(reason) {
    throw new Error(reason);
}

Использование:

console.log("Hello");
die("Exiting script..."); // Kills script right here
console.log("World!");

В приведенном выше примере будет напечатано только «Hello».

Nanoo
источник
-1

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

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

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

Джон Смит
источник
-2

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

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

нельзя анализировать прямо из анализа 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

kapad
источник
1
Это на самом деле не отвечает на вопрос. Они говорят об общей проблеме, не связанной с вашими конкретными переменными / файлом SSE.
Mjk
1
MJK - лучше сейчас?
Капад
-3

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

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

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

iamsaurav
источник
1
Это, однако, выдает ошибку в ваших линтерах как «Невозможно использовать« возврат »вне функции»
Carles Alcolea
Он останавливает выполнение, потому что оператор недействителен. Вы также можете использовать if (condition) { new new }или if (condition) { purpleMonkeyDishwasher(); }.
Coderer