Как я могу выйти из сценария JavaScript так же, как exit
PHP или die
? Я знаю, что это не лучшая практика программирования, но мне нужно.
Как завершить скрипт в JavaScript?
Ответ 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
}
это просто останавливает выполнение программы из этой строки, вместо того, чтобы выдавать какие-либо ошибки в консоли.