如何终止JavaScript中的脚本?


149

如何像PHP exit或一样退出JavaScript脚本die?我知道这不是最佳编程实践,但我需要这样做。


1
您认为您可以扩展此要求吗,您到底为什么要实现这一要求?
andynormancx

8
@andynormancx,这对于调试很方便。
SET

3
只是return;根据您的要求就足够了,就像没有参数的die()一样。
Ishikawa

2
如果“需要”,最好重新考虑设计。
弗鲁吉'18

18
为什么第一个问题总是“为什么”?
约翰·克特吉克

Answers:


80

等同于PHP的JavaScriptdie。顺便说一句,它只是调用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 '';
}


该代码似乎不会阻止触发元素上的事件,只是阻止窗口的事件。因此,您还需要遍历页面上的所有元素,以执行类似的操作。虽然这听起来像是一个非常奇怪的要求。
andynormancx

2
整个模具的概念有点破损-流程应该能够处理所有偶然事件,无论是否需要尝试捕获。
annakata

我认为您没有包括所有应处理的事件,例如“ selectstart”事件。
小野大og

4
您无法停止XMLHttpRequest处理程序。当前代码不会停止执行间隔或超时。演示:jsfiddle.net/skibulk/wdxrtvus/1您可能认为这是解决方法:stackoverflow.com/a/8860203/6465140
skibulk

73

“退出”功能通常会退出程序或脚本,并以错误信息作为参数。例如php中的die(...)

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); 这是一种在处理脚本时快速结束脚本并获取变量值的好方法。
Andrew Swift 2014年

1
@ultimate我认为#Sydwell可以将整个脚本包装在try / catch中,因此您可以获得a)干净出口b)必要时可能出现的异常消息:)抛出未抛出异常通常不会带来任何好处:)
jave.web

47

即使在没有句柄,事件等的简单程序中,也最好将代码放入“主”函数中,即使它是唯一的过程也是如此:

<script> 
function main()
{
//code

}
main();
</script>

这样,当您要停止程序时,可以使用“返回”。


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以退出。


我不想通过解释首字母缩写出现在谷歌上来侮辱读者的智慧。我建议您不要将JavaScript代码与REPL命令混合使用,因为如果用户复制/粘贴该代码块并运行它,他们将在“ .exit”行上收到语法错误。
Dan Dascalescu



2

我认为此问题已得到解答,请单击此处获取更多信息。以下是发布的简短答案。

throw new Error("Stop script");

您还可以使用浏览器添加断点,每个浏览器都类似,请在下面查看您的浏览器信息。

对于Chrome断点信息,请单击此处。
对于Firefox断点信息,请单击此处。
对于资源管理器断点信息。点击
在Safari中断点信息请点击这里


1

如果您正在寻找一种方法来强制终止页面上所有Javascript的执行,那么我不确定是否存在正式批准的方法来执行此操作-似乎这种事情可能会带来安全风险(尽管老实说,我想不起来怎么回事)。通常,在Javascript中,当您希望代码停止运行时,return无论执行什么功能,您都可以。(return如果该语句是函数中的最后一句话,并且该函数不应返回值,则该语句是可选的)如果由于某种原因,返回对您而言不够好,则可能应在问题中编辑更多详细信息,以了解为什么您认为您需要它,也许有人可以提供替代解决方案。

请注意,实际上,大多数浏览器的Javascript解释器如果遇到错误,只会停止运行当前脚本。因此,您可以执行类似访问未设置变量的属性的操作:

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

并且可能会中止脚本。但是您不应该指望它,因为它根本不是标准,这确实是一种可怕的做法。

编辑:好的,鉴于Ólafur的回答,也许这不是一个很好的答案。尽管die()他链接的功能基本上实现了我的第二段,即它只是引发了错误。


1
所有这些将停止脚本的当前执行位。它不会阻止新事件触发和运行新的脚本位。
andynormancx

更不用说,您不需要额外的错误函数即可引发错误。Javascript具有内置的throw语句。
克里斯,

die函数的作用远不止p.blah(),它在Windows事件中运行并用“ e.preventDefault(); e.stopPropagation();”替换它们具有的句柄,这将停止事件触发。然后它引发异常。
andynormancx

1

抛出“”;

是对该概念的滥用,但可能是唯一的选择。而且,是的,您将必须重置所有事件侦听器,就像接受的答案中提到的一样。如果我是对的,您还需要一个入口点。

在它的顶部:您需要一个页面,该页面在抛出该页面后立即通过电子邮件向您报告-您可以为此使用Raven / Sentry。但这意味着,您会产生误报。在这种情况下,您还需要更新默认处理程序以过滤掉此类事件,或在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的exit()。与其他解决方案一样,不要添加其他任何内容。

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

0

只需创建一个BOOL条件,这里不需要复杂的代码。

即使您一次将它设为true /或多次,它都将为您提供一行解决方案,而不是多个-基本上就是这样。


0

如果在脚本中使用任何未定义的函数,则由于“ Uncaught ReferenceError”,脚本将停止。我已经尝试通过以下代码并执行前两行。

我认为,这是停止脚本的最佳方法。如果还有其他方法,请给我评论。我也想知道另一种最佳和简单的方法。顺便说一句,我没有退出或终止像PHP这样的Java脚本中的内置函数来终止脚本。如果有人知道,请告诉我。

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

我知道这很旧,但是如果您想要类似的PHP die()函数,则可以执行以下操作:

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

用法:

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

上面的示例将仅打印“ Hello”。


-1

我使用这段代码停止执行:

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

您会收到控制台错误,但对我有用。


-2

这是一个示例,如果存在条件,则终止脚本。如果在SSE客户端javascript中使用此代码,

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

可以从JSON解析中解析canot ...

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-现在好些了吗?
kapad

-3

我使用return语句而不是throw,因为throw在控制台中给出了错误。最好的方法是检查状况

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

这只是从该行停止了程序的执行,而不是在控制台中给出任何错误。


1
但是,它给您的linter带来了错误,因为“无法在函数外部使用'return'”
Carles Alcolea

由于该语句无效,它将停止执行。您也可以使用if (condition) { new new }if (condition) { purpleMonkeyDishwasher(); }
编码器
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.