如何在JavaScript中终止脚本?

时间:2009-02-15 09:14:50

标签: javascript exit die

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

27 个答案:

答案 0 :(得分:71)

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 '';
}

答案 1 :(得分:56)

“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

答案 2 :(得分:43)

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

<script> 
function main()
{
//code

}
main();
</script>

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

答案 3 :(得分:8)

退出JS或Node脚本有many ways。以下是最相关的:

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

答案 4 :(得分:6)

如果你不在乎它只是写一个错误:

fail;

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

答案 5 :(得分:3)

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

我希望它有所帮助。

更多信息,请访问:

答案 6 :(得分:1)

这个答案提供了详细信息,演示了额外的框架,有助于解决模块化javascripts中的这个以及其他早期退出,异常,过程控制和顺序函数处理需求。解决方案提供闭包示例这个答案假定个人希望页面上的其他脚本在相关脚本退出后继续运行。

这里简单解决方案的实例:https://codepen.io/corpus_khu/pen/VpMQzO

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

以上是一种非常简单的退出方式。在将函数发送到此“Runner”之前,我建议将函数包装在一个加载线束并可执行的对象中,将测试工具包裹起来,测试工具应将exit()之类的方法暴露给您的函数,这样它们就没有了被通过。

在github上可以找到构建良好退出策略所需的一切示例(文件:pseudo_threads2.js):https://github.com/fromSpace/js-recursionwithevents-practice

现场演示版: https://fromspace.github.io/js-recursionwithevents-practice/

请注意,在pseudo_threads2.js中,函数simConstantMomentum()返回一个具有所有线束函数的词法范围变量的函数。相反,我建议您在此函数的顶部调用一个线束生成器并将其结果分配给本地var,这样当您完成时,您要退出的函数看起来更像是这样。

var rockStarFunction = new function (){
var harness = reducePublicStrapOnFromCache()._url(location);
return function(){
        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;
    };
}

我在这里提供的解决方案就是我推荐的解决方案,如果您的目的是构建一个具有exit,assert,mock和内置功能的javascript runner容器。我认为这是构建这个容器的更好方法并使我的功能可传输。 - corpus_khu

答案 7 :(得分:1)

在我的情况下,我使用window.stop API,就像点击浏览器上的X按钮一样:

window.stop();

答案 8 :(得分:1)

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

方法1:

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

方法2:

return;

方法3:

return false;

方法4:

new new

方法5:

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

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

debugger; 

答案 9 :(得分:0)

总结不同的选项:

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

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

答案 10 :(得分:0)

如果您只想停止执行其他代码而不会“抛出”任何错误,则可以如cross-exit所示暂时覆盖window.onerror

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.");

答案 11 :(得分:0)

我正在使用iobroker,并且可以轻松地使用来停止脚本

stopScript();

答案 12 :(得分:0)

在大多数情况下均不适用,但是我在浏览器中运行了许多异步脚本,而作为黑客,我确实这样做

window.reload();

停止一切。

答案 13 :(得分:0)

我知道这很老了,但是如果您想要类似的PHP die()函数,则可以这样做:

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

用法:

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

上面的示例将仅显示“ Hello”。

答案 14 :(得分:0)

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

    for(;;);

答案 15 :(得分:0)

抛出“”;

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

在其顶部:您需要一个页面,该页面在抛出后立即通过电子邮件向您报告-您可以为此使用例如Raven / Sentry。但这意味着,您会产生误报。在这种情况下,您还需要更新默认处理程序以过滤掉此类事件,或在Sentry的仪表板上忽略时设置此类事件。

window.stop();

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

调试器;

仅在打开调试器的情况下停止执行。效果很好,但无法交付。

答案 16 :(得分:0)

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

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

上面的脚本只会记录一个

使用前

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

答案 17 :(得分:0)

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

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

alert('Hello');

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

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

alert('bye');

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

答案 18 :(得分:0)

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

throw new Error("Stop script");

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

有关Chrome断点信息,请点击here
有关Firefox断点信息,请单击here
有关资源管理器断点的信息,click
有关Safari断点信息,请点击here

答案 19 :(得分:0)

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

如果甚至将其设置为true /或多次, 两者都会为您提供一行解决方案,而不是多个- 基本上就这么简单。

答案 20 :(得分:0)

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

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

答案 21 :(得分:0)

更新:只要您不catch它就行了!

throw window.location.assign('dead.html');

答案 22 :(得分:0)

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

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

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

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

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

答案 23 :(得分:-1)

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

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

尽管会出现控制台错误,但对我有用。

答案 24 :(得分:-1)

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

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

答案 25 :(得分:-3)

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

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

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

答案 26 :(得分:-3)

如果您使用的是 Firefox 或浏览器,一旦您启动了迭代器(如您所见),大多数控制台方法都无法完成。您可以转到源并手动暂停脚本的执行。 (这仍然不能完全阻止它)

Screenshot of Developer Mode