如何在 JavaScript 中终止脚本?

IT技术 javascript exit die
2021-01-16 05:34:51

如何退出 JavaScript 脚本,就像 PHPexitdie? 我知道这不是最好的编程实践,但我需要这样做。

6个回答

“退出”函数通常会退出程序或脚本,并带有错误消息作为参数。例如 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
不要忘记你可以在错误中添加一条消息: throw new Error('variable ='+x); 这是在您处理脚本时快速结束脚本并获取变量值的好方法。
2021-03-16 05:34:51
@ultimate 我认为 #Sydwell 将整个脚本包装在 try/catch 中,因此您可以获得 a) 干净退出 b) 需要时可能出现的异常消息 :) 抛出未得到的异常通常不会带来任何好处 :)
2021-04-05 05:34:51
@Sydwell :如果你用 catch 块包围它,它将被捕获并且程序不会终止,无视这里的要点。
2021-04-08 05:34:51

JavaScript 相当于 PHP 的die. 顺便说一句,它只是调用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 '';
}
整个模具概念有点破碎 - 流程应该能够处理任何和所有可能发生的情况,无论是否需要 try-catch。
2021-03-26 05:34:51
为什么 javascript 需要如此复杂的 hack 来实现应该存在的基本功能?
2021-03-27 05:34:51
2021-04-02 05:34:51
该代码似乎不会阻止元素上的事件触发,只是窗口的事件。所以你还需要遍历页面上的所有元素,做类似的事情。不过,这听起来像是一个非常奇怪的要求。
2021-04-03 05:34:51
您无法停止 XMLHttpRequest 处理程序。当前代码不会停止执行间隔或超时。演示:jsfiddle.net/skibulk/wdxrtvus/1 你可能认为这是一个修复:stackoverflow.com/a/8860203/6465140
2021-04-06 05:34:51

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

<script> 
function main()
{
//code

}
main();
</script>

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

优秀的。干净、简单、有效。谢谢!
2021-03-13 05:34:51

如果你不在乎这是一个错误,只需写:

fail;

这将阻止您的主要(全局)代码继续进行。对调试/测试的某些方面很有用。

这就是重点 - 您也可以这样做mikeyMouse;- 错误将终止。它又快又脏。
2021-03-27 05:34:51
啊足够公平 - 也许将其添加到您的答案中?
2021-03-30 05:34:51
window.fail 在当前浏览器中未定义。
2021-03-31 05:34:51
出于调试目的(因为否则您不在乎),如果要以快速且“肮脏”的方式退出,则最好显示一条(可识别的)消息 throw(message)
2021-04-02 05:34:51
是的,让人们知道您只是通过调用未定义的变量来强制引用错误可能会有所帮助
2021-04-03 05:34:51

很多方法可以退出 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”行上收到语法错误。
2021-04-04 05:34:51