如何终止 JavaScript 中的脚本?

Posted

技术标签:

【中文标题】如何终止 JavaScript 中的脚本?【英文标题】:How to terminate the script in JavaScript? 【发布时间】:2010-10-07 17:25:35 【问题描述】:

如何像 phpexitdie 那样退出 javascript 脚本?我知道这不是最佳编程实践,但我需要这样做。

【问题讨论】:

@andynormancx,这可能对调试很方便。 return; 可能就足够了,具体取决于您的要求,就像没有参数的 die()。 如果您“需要”它,最好重新考虑您的设计。 为什么第一个问题总是“为什么”? 这个问题非常简单明了:它说“terminate the script”。这意味着脚本已经结束。完成的。在那之后,不应期望再发生任何事情。这不仅仅意味着“终止函数”。来自函数的return(如这里所建议的)不是解决方案,因为之后可能会发生其他事情,而程序员想要取消它们!我觉得很简单 【参考方案1】:

JavaScript equivalent for PHP's 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 '';

【讨论】:

这里是exit的源代码:kevin.vanzonneveld.net/techblog/article/… 该代码似乎并没有阻止元素上的事件触发,只是窗口的事件。所以你还需要遍历页面上的所有元素做类似的事情。不过,这听起来像是一个非常奇怪的要求。 整个 die 的概念有点破 - 流程应该能够处理任何和所有的可能性,无论是否需要 try-catch。 您无法停止 XMLHttpRequest 处理程序。当前代码不会停止执行间隔或超时。演示:jsfiddle.net/skibulk/wdxrtvus/1 您可能认为这是一个修复:***.com/a/8860203/6465140 为什么 JavaScript 需要如此复杂的 hack 来实现应该存在的基本功能?【参考方案2】:

如果您正在寻找一种方法来强制终止页面上所有 Javascript 的执行,我不确定是否有官方认可的方法来做到这一点 - 这似乎是一种可能存在安全风险的事情(虽然老实说,我想不出它会如何脱离我的脑海)。通常在 Javascript 中,当您希望代码停止运行时,您只需 return 来自正在执行的任何函数。 (return 语句是可选的,如果它是函数中的最后一件事并且函数不应该返回值)如果由于某种原因返回对您来说不够好,您可能应该在问题中编辑更多细节为什么你认为你需要它,也许有人可以提供替代解决方案。

请注意,实际上,大多数浏览器的 Javascript 解释器在遇到错误时会简单地停止运行当前脚本。所以你可以做一些事情,比如访问一个未设置变量的属性:

function exit() 
    p.blah();

它会可能中止脚本。但是你不应该指望它,因为它根本不是标准的,而且它看起来真的是一种糟糕的做法。

编辑:好吧,鉴于 Ólafur 的说法,这可能不是一个好的答案。虽然他链接的die() 函数基本上实现了我的第二段,即它只是抛出一个错误。

【讨论】:

所有这一切都会停止当前正在执行的脚本位。它不会阻止新事件触发和运行新的脚本。 更不用说,您不需要额外的错误函数来引发错误。 Javascript 有一个内置的 throw 语句。 die 函数比你的 p.blah() 做得更多,它运行 windows 事件并用 "e.preventDefault();e.stopPropagation();" 替换它们的句柄,这将停止事件触发。 然后它抛出一个异常。【参考方案3】:

“exit”函数通常会退出程序或脚本,并带有错误消息作为参数。例如 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

【讨论】:

@Sydwell : 如果你用 catch 块包围它,它将被捕获并且程序不会终止,这与这里的观点不符。 别忘了可以给错误加一条信息: throw new Error('variable ='+x);这是一种在您处理脚本时快速结束脚本并获取变量值的好方法。 @ultimate 我认为#Sydwell 将整个脚本包装在 try/catch 中,因此您可以在需要时获得 a) 干净退出 b) 可能的异常消息 :) 抛出未处理的异常通常不会带来有什么好处:)【参考方案4】:

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

<script> 
function main()

//code


main();
</script>

这样,当你想停止程序时,你可以使用“return”。

【讨论】:

优秀。干净、简单、有效。谢谢! 如果你是一个糟糕的程序员并且不要将你的代码分解成其他函数,那么它就可以工作。如果你这样做了,那么在函数内部的函数内部的 return 不会做你想要的。【参考方案5】:

debugger; 关键字放在您要停止执行的JavaScript 代码中。然后打开您喜欢的浏览器的开发者工具并重新加载页面。现在它应该会自动暂停。打开工具的 Sources 部分:突出显示 debugger; 关键字,您可以选择恢复脚本执行。

希望对你有帮助。

更多信息请访问:

https://developer.mozilla.org/de/docs/Tools/Debugger

http://www.w3schools.com/js/js_debugging.asp

【讨论】:

【参考方案6】:

在我的例子中,我使用了window.stop API,这就像单击浏览器上的 X 按钮:

window.stop();

【讨论】:

window.stop API 是什么意思?我刚刚使用了window.stop() 并被忽略了!【参考方案7】:

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

fail;

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

【讨论】:

window.fail 在当前浏览器中没有定义。 这就是重点——你也可以这样做mikeyMouse;——错误将终止。它又快又脏。 啊,很公平 - 也许将其添加到您的答案中? 是的,让人们知道您只是通过调用未定义的变量来强制出现 ReferenceError 可能会有所帮助 出于调试目的(否则你不在乎),如果要以快速和“肮脏”的方式退出,那么最好用throw(message)显示一条(可识别的)消息【参考方案8】:

这是一个例子, 如果存在条件,则终止脚本。 我在我的 SSE 客户端 javascript 中使用它,如果

<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 脚本

【讨论】:

这并不能真正回答问题。他们谈论的是一般问题,与您的特定 SSE 变量/文件无关。 mjk - 现在好点了吗?【参考方案9】:

有many ways可以退出一个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”行出现语法错误。【参考方案10】:

这个小函数非常接近于模仿 PHP 的 exit()。与其他解决方案一样,不要添加任何其他内容。

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

【讨论】:

【参考方案11】:

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

即使您将其设置为 true/ 或多次, 它都会给你一个解决方案/而不是多个 - 基本上就这么简单。

【讨论】:

问题是动作,而不是触发动作的条件。【参考方案12】:

抛出“”;

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

最重要的是:您想要一个页面,一旦它抛出就会通过电子邮件向您报告 - 您可以使用例如 Raven/Sentry 来实现此目的。但这意味着,您会产生误报。在这种情况下,您还需要更新默认处理程序以过滤掉此类事件或在 Sentry 的仪表板上将此类事件设置为忽略。

window.stop();

这在页面加载期间不起作用。它也停止对页面的解码。因此,您不能真正使用它为用户提供您的页面的无 javascript 变体。

调试器;

仅在调试器打开时停止执行。效果很好,但不是可交付成果。

【讨论】:

【参考方案13】:

我认为这个问题已经得到解答,点击here了解更多信息。以下是它发布的简短答案。

throw new Error("Stop script");

您也可以使用您的浏览器添加断点,每个浏览器都相似,请查看以下信息以了解您的浏览器。

对于 Chrome 断点信息,请单击 here 对于 Firefox 断点信息,请单击 here 对于资源管理器断点信息click 对于 Safari 断点信息,请单击 here

【讨论】:

【参考方案14】:

如果您在脚本中使用任何未定义的函数,则脚本将因“未捕获的引用错误”而停止。我尝试了以下代码并执行了前两行。

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

alert('Hello');

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

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

alert('bye');

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

【讨论】:

它确实终止了其余的代码,但至少你可以给它一个错误消息。 throw new Error('\r\n\r\nError Description:\r\nI\'m sorry Dave, I\'m afraid I can\'t do that.');【参考方案15】:

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

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

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

【讨论】:

然而,它在你的 linter 中给出错误为“不能在函数之外使用'return'” 它停止执行,因为该语句无效。您也可以使用if (condition) new new if (condition) purpleMonkeyDishwasher(); 【参考方案16】:

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

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

虽然你会得到一个控制台错误,但它对我很有用。

【讨论】:

【参考方案17】:

如果您只是想阻止进一步的代码执行而不“抛出”任何错误,您可以临时覆盖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.");

【讨论】:

【参考方案18】:

在 JavaScript 中有多种方式,下面是其中的一些

方法一:

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

方法二:

return;

方法三:

return false;

方法四:

new new

方法五:

使用上述方法编写您的自定义函数并在需要的地方调用

注意: 如果您只想暂停代码执行,可以使用

debugger; 

【讨论】:

【参考方案19】:

我正在使用 iobroker 并且很容易设法停止脚本

stopScript();

【讨论】:

【参考方案20】:

在大多数情况下不适用,但我在浏览器中运行了很多异步脚本,并且我这样做了

window.reload();

停止一切。

【讨论】:

【参考方案21】:

我知道这是旧的,但如果你想要一个类似的 PHP die() 函数,你可以这样做:

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

用法:

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

上面的例子只会打印“Hello”。

【讨论】:

【参考方案22】:

此代码将停止当前窗口中所有 JavaScript 的执行:

    for(;;);

示例

console.log('READY!');

setTimeout(()=>

  /* animation call */ 
  div.className = "anim";

  console.log('SET!');

  setTimeout(()=>

    setTimeout(()=>
      console.log('this code will never be executed');
    ,1000);

    console.log('GO!');

    /* BOMB */
    for(;;);

    console.log('this code will never be executed');

  ,1000);

,1000);
#div 
  position: fixed;
  height: 1rem; width: 1rem;
  left:   0rem; top:   0rem;
  transition: all 5s;
  background: red;

/* this <div> will never reached the right bottom corner */
#div.anim 
  left: calc(100vw - 1rem);
  top:  calc(100vh - 1rem);
&lt;div id="div"&gt;&lt;/div&gt;

【讨论】:

只是让整个事情崩溃。 @Ste 有时,当您需要在当前控制流之外停止脚本的执行,或者停止所有 WebWorkers 在连接到当前页面的不同混淆脚本中工作时,只需控制台和 10 秒即可想想,没有替代的解决方案。 throw new Error('\r\n\r\nError Description:\r\nI\'m sorry Dave, I\'m afraid I can\'t do that.'); 不起作用吗? 嗯,这很酷!我想我的环境不喜欢它并崩溃了。这是一个 Windows 应用程序,而不是基于 Web 的。 throw new... 有效。 @Ste 无限循环取代所有可执行的 libuv 线程并一直运行直到堆栈完全溢出。【参考方案23】:

总结不同的选择:

window.stop();
debugger;
for(;;);
window.location.reload();

如果页面已加载并且您不想调试崩溃或重新加载:

throw new Error();

另外清除所有timeouts

var id = window.setTimeout(function() , 0);
while (id--) 
    window.clearTimeout(id);

中止DOM/XMLHttpRequest

$.xhrPool = [];
$.xhrPool.abortAll = function() 
    $(this).each(function(i, jqXHR)  
        jqXHR.abort();  
        $.xhrPool.splice(i, 1); 
    );

$.ajaxSetup(
    beforeSend: function(jqXHR)  $.xhrPool.push(jqXHR); ,
    complete: function(jqXHR) 
        var i = $.xhrPool.indexOf(jqXHR);
        if (i > -1) $.xhrPool.splice(i, 1); 
    
);

删除all event listeners,包括inline

$("*").prop("onclick", null).off();

这将删除脚本并重新创建没有事件的元素

$('script').remove();
$('*').each(function()
    $(this).replaceWith($(this).clone());   
);

如果网页上没有 jQuery,请将 source code 复制粘贴到控制台中。

可以在 devtools 中禁用 Javascript:ctrl+shift+j 后跟 cltf+shift+p 然后输入 disable javascript

可能还有其他东西。请在评论中告诉我。

【讨论】:

清除超时和其他一些答案对我有用。【参考方案24】:

要停止脚本执行而不会出现任何错误,您可以将所有脚本包含在一个函数中并执行它。 这是一个例子:

(function () 
    console.log('one');
    return;
    console.log('two');
)();

上面的脚本只会记录一个

使用前

如果您需要在脚本本身之外读取脚本的函数,请记住(通常)它不起作用:要执行此操作,您需要使用预先存在的变量或对象(您可以将您的window 对象中的函数)。 上面的代码可能是你不想要的:将整个脚本放在一个函数中可能会产生其他后果(例如,这样做,脚本将立即运行,并且无法从据我所知,Chrome 浏览器正在开发中)

【讨论】:

以上是关于如何终止 JavaScript 中的脚本?的主要内容,如果未能解决你的问题,请参考以下文章

成功识别脚本中的 PID 后,如何终止进程? [复制]

如何自动终止脚本内命令的无限执行?

如何终止Java中的持久线程? [复制]

java Html&JavaScript面试题:HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交?

用 Rhino 解释 Java 中的 JavaScript:暂停/恢复脚本

如何在 Java 中停止 currentThread? [复制]