Як закінчити сценарій у JavaScript?


149

Як я можу вийти з сценарію JavaScript так, як PHP exitабо die? Я знаю, що це не найкраща практика програмування, але мені потрібно.


1
Як ви думаєте, ви могли б розширити цю вимогу, саме чому ви намагаєтесь цього досягти?
andynormancx

8
@andynormancx, це може бути зручно для налагодження.
SET

3
просто return;може бути достатньо залежно від ваших вимог, діє як die () без параметрів.
Ішикава

2
Якщо вам це "потрібно", можливо, вам буде краще переосмислити свій дизайн.
Фрунгі

18
чому завжди перше питання "чому"?
John ktejik

Відповіді:


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
вся концепція die трохи розбита - потік повинен бути здатний вирішувати будь-які й усі можливі випадки, будь то спроба виїзду на вимогу чи ні.
annakata

Я думаю, ви не включили всі події, з якими слід обробляти, наприклад, "selectstart" подія.
Ono Oogami

4
Ви не можете зупинити обробники XMLHttpRequest. Поточний код не зупиняє інтервали чи тайм-аути від виконання. Демо: jsfiddle.net/skibulk/wdxrtvus/1 Ви можете розглянути це як виправлення:
stackoverflow.com/a/8860203/6465140

73

Функції "вихід" зазвичай виходять із програми або сценарію разом із повідомленням про помилку як параметр. Наприклад, die (...) у php

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

Еквівалент в JS є сигнал про помилку з кидком ключовим словом , як це:

throw new Error();

Ви можете легко перевірити це:

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

x
>>>undefined
m
>>>100

46
@Sydwell: Якщо ви оточите його блоком catch, він буде схоплений, і програма не завершиться, не спричиняючи тут точки.
остаточне

4
Не забувайте, що ви можете додати повідомлення про помилку: киньте нову помилку ('змінний =' + x); Це хороший спосіб швидко закінчити скрипт під час роботи над ним і отримати значення змінної.
Ендрю Свіфт

1
@ultimate Я думаю, що #Sydwell ment, щоб завершити весь сценарій у спробі / лові, так що ви можете отримати а) чистий вихід b) можливе повідомлення про виключення, коли це потрібно :) Закидання невмілих винятків, як правило, не приносить користі :)
jave.web

47

Навіть у простих програмах без ручок, подій тощо, найкраще ввести код у "основну" функцію, навіть коли це єдина процедура:

<script> 
function main()
{
//code

}
main();
</script>

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


15

Якщо вам все одно, що це помилка, просто напишіть:

fail;

Це зупинить ваш основний (глобальний) код від подальшого виконання. Корисно для деяких аспектів налагодження / тестування.


1
window.failне визначено в поточних браузерах.
mikemaccana

7
Ось у чому справа - ви також можете зробити mikeyMouse;- помилка припиняється. Це швидко і брудно.
Марк

1
Ну досить чесно - може, додати це до своєї відповіді?
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для виходу.


Я не хотів ображати інтелект читачів, пояснюючи абревіатуру, яка з'являється як перший результат роботи в Google. Я пропоную вам не змішувати код JavaScript з командами REPL, тому що якщо користувач скопіює / вставить цей блок коду і запустить його, він отримає синтаксичну помилку в рядку ".exit".
Дан Даскалеску

6

У моєму випадку я використовував window.stopAPI, який схожий на натискання кнопки X у вашому браузері:

window.stop();

5

Розмістіть debugger;ключове слово у своєму коді JavaScript, де ви хочете зупинити виконання. Потім відкрийте улюблені інструменти для розробників браузера та перезавантажте сторінку. Тепер він повинен автоматично призупинитися. Відкрийте розділ " Джерела " своїх інструментів: debugger;ключове слово виділено, і у вас є можливість відновити виконання сценарію.

Я сподіваюся, що це допомагає.

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


2

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

throw new Error("Stop script");

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

Для інформації про точки перерви в Chrome натисніть тут.
Для інформації про точки перерви Firefox натисніть тут.
Для інформації про точки перерви Explorer натисніть
Для інформації про точки перерви Safari натисніть тут


1

Якщо ви шукаєте спосіб примусово припинити виконання всіх Javascript на сторінці, я не впевнений, що існує офіційно санкціонований спосіб зробити це - це схоже на те, що може спричинити загрозу безпеці (хоча чесно кажучи, я не можу придумати, як це було б у верхній частині моєї голови). Зазвичай у Javascript, коли ви хочете, щоб ваш код перестав працювати, ви просто returnз будь-якої функції, яка виконується. ( returnЗаява необов’язково, якщо це останнє в функції і функція не повинна повертати значення) Якщо є причина, що повернення недостатньо добре для вас, ви, ймовірно, повинні відредагувати детальніше питання, чому ви думаєте вам це потрібно, і, можливо, хтось може запропонувати альтернативне рішення.

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

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

і це, мабуть, скасує сценарій. Але на це не варто розраховувати, оскільки це зовсім не стандартне, і це справді здається жахливою практикою.

EDIT : Гаразд, можливо, це було не настільки хороша відповідь у світлі Олафура. Хоча die()функція, з якою він пов'язується, в основному реалізує мій другий абзац, тобто він просто видає помилку.


1
Все, що буде зроблено, зупинить поточний біт сценаріїв. Це не зупинить нових подій від запуску та запуску нових біт сценарію.
andynormancx

Не кажучи вже про те, що вам не потрібна додаткова погана функція, щоб видалити помилку. У Javascript є вбудована операція кидання.
Кріс

Функція die робить набагато більше, ніж ваш p.blah (), вона проходить через події Windows і замінює їхні ручки на "e.preventDefault (); e.stopPropagation ();", що зупинить запуск подій. Тоді це кидає виняток.
andynormancx

1

кинути "";

Це неправильне використання концепції, але, мабуть, єдиний варіант. І так, вам доведеться скинути всіх слухачів подій, так само, як згадується прийнята відповідь. Також вам знадобиться єдиний пункт входу, якщо я маю рацію.

Нагорі: Ви хочете, щоб сторінка, яка повідомляє вам електронною поштою, як тільки вона перекинеться - ви можете використовувати для цього, наприклад, Ворона / Сентрі. Але це означає, що ви виробляєте помилкові позитиви. У такому випадку вам також потрібно оновити обробник за замовчуванням для фільтрації таких подій або встановлення таких подій на ігнорування на інформаційній панелі Sentry.

window.stop ();

Це не працює під час завантаження сторінки. Він також припиняє розшифровку сторінки. Таким чином, ви не можете реально використовувати його, щоб запропонувати користувачеві варіант без вашої JavaScript.

налагоджувач;

Зупиняє виконання лише при відкритій відладчику. Працює чудово, але не є результатом.


1

У JavaScript існує кілька способів, нижче - деякі з них

Спосіб 1:

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

Спосіб 2:

return;

Спосіб 3:

return false;

Спосіб 4:

new new

Спосіб 5:

написати свій користувальницький функцію, що використовується вище, та зателефонувати туди, куди потрібно

Примітка. Якщо ви хочете просто призупинити виконання коду, який ви можете використовувати

debugger; 

0

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

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

0

Просто створіть умову BOOL, тут не потрібно складного коду ..

Якщо навіть один раз ви перетворите його на істинний / або багаторазовий, він одночасно дасть вам один рядок рішення / не декілька - в основному простий.


0

Якщо ви використовуєте будь-яку невизначену функцію в сценарії, сценарій припиняється через "Uncaught ReferenceError". Я спробував, дотримуючись наступного коду та перших двох рядків.

Я думаю, це найкращий спосіб зупинити сценарій. Якщо є якийсь інший спосіб, то будь ласка, прокоментуйте мене. Я також хочу знати інший найкращий і простий спосіб. До речі, я не отримав функцію виходу або загибелі вбудованого в Javascript, як PHP, для припинення сценарію. Якщо хтось знає, то, будь ласка, дайте мені знати.

alert('Hello');

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

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

alert('bye');

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

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();

0

Не застосовується в більшості обставин, але у мене було багато скриптів асинхронізації, які працюють у браузері і як хак я роблю

window.reload();

щоб все зупинити.


0

Я знаю, що це старе, але якщо ви хочете схожу die()функцію PHP , ви можете зробити:

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

Використання:

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

Наведений вище приклад надрукує лише "Привіт".


-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


1
Це насправді не відповідає на питання. Вони говорять про загальну проблему, нічого спільного з вашими конкретними змінними SSE / файлом.
mjk

1
mjk - краще зараз?
капад

-3

Я використовую оператор return замість кидка, оскільки кидок дає помилку в консолі. найкращий спосіб зробити це - перевірити стан

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

це просто зупиняє виконання програми з цього рядка, замість того, щоб створювати помилки в консолі.


1
Однак це дає помилку у ваших лінерах як "Неможливо використати" повернення "поза функцією"
Carles Alcolea

Він зупиняє виконання, оскільки заява недійсна. Ви також можете використовувати if (condition) { new new }або if (condition) { purpleMonkeyDishwasher(); }.
Coderer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.