198

我怎样才能像 PHPexit或一样退出 JavaScript 脚本die?我知道这不是最好的编程实践,但我需要这样做。

4

24 回答 24

88

“退出”函数通常会退出程序或脚本,并带有错误消息作为参数。例如 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
于 2011-08-28T19:22:43.243 回答
86

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 '';
}
于 2009-02-15T09:17:34.157 回答
57

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

<script> 
function main()
{
//code

}
main();
</script>

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

于 2011-09-28T14:12:26.147 回答
23

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

fail;

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

于 2017-09-19T18:51:07.960 回答
21

很多方法可以退出 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退出。

于 2018-04-12T17:32:26.263 回答
9

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

我希望它有所帮助。

更多信息请访问:

于 2017-03-18T21:12:57.213 回答
8

就我而言,我使用了window.stop.

停止在当前浏览上下文中window.stop()进一步加载资源,相当于浏览器中的“停止”按钮。

由于脚本的执行方式,此方法不能中断其父文档的加载,但会停止其图像、新窗口和其他仍在加载的对象。

用法:(来源 window.stop();
_

于 2017-08-22T02:03:26.147 回答
4

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

上面提到的可能选项:

window.stop(); // equivalent to the 'stop' button in the browser
debugger; // debugs
for(;;); // crashes your browser
window.location.reload(); // reloads current page

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

throw new Error();

另外清除所有超时

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

删除所有事件侦听器,包括内联

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

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

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

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

可能还有别的东西。在评论中告诉我。

于 2021-06-18T21:52:09.957 回答
3

我想这个问题已经回答了,点击这里了解更多信息。以下是它发布的简短答案。

throw new Error("Stop script");

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

Chrome 断点信息请单击此处
Firefox 断点信息请单击此处
Explorer 断点信息请单击
Safari 断点信息请单击此处

于 2019-05-19T22:28:02.310 回答
3

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

方法一:

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

方法二:

return;

方法三:

return false;

方法四:

new new

方法五:

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

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

debugger; 
于 2020-04-11T20:04:48.273 回答
1

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

请注意,在实践中,大多数浏览器的 Javascript 解释器在遇到错误时会简单地停止运行当前脚本。因此,您可以执行诸如访问未设置变量的属性之类的操作:

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

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

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

于 2009-02-15T09:27:10.170 回答
1

扔 ””;

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

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

窗口.stop();

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

调试器;

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

于 2019-03-01T15:40:24.483 回答
1

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

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

用法:

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

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

于 2020-07-03T14:11:27.463 回答
0

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

function exit(Msg)
    {
    Msg=Msg?'*** '+Msg:'';
    if (Msg) alert(Msg);
    throw new Error();
    } // exit
于 2018-10-25T13:29:10.937 回答
0

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

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

alert('Hello');

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

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

alert('bye');

document.write('Bye User!!!');
于 2019-05-29T04:17:16.543 回答
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.");
于 2020-01-09T12:06:52.667 回答
0

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

stopScript();
于 2020-05-01T15:49:34.340 回答
0

此代码将停止当前窗口中所有 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);
}
<div id="div"></div>

于 2020-12-06T08:22:04.937 回答
0

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

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

上面的脚本只会记录一个.

使用前

  • 如果您需要在脚本本身之外读取脚本的函数,请记住(通常)它不起作用:为此,您需要使用预先存在的变量或对象(您可以将函数放在窗口对象)。
  • 上面的代码可能是您不想要的:将整个脚本放在一个函数中可能会产生其他后果(例如,这样做,脚本将立即运行,并且在开发过程中无法从浏览器修改其部分,据我所知,在 Chrome 中)
于 2021-07-31T19:42:05.423 回答
-1

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

window.reload();

停止一切。

于 2020-06-04T11:57:58.060 回答
-2

这是一个示例,如果存在条件,则终止脚本。我在我的 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 脚本

于 2017-10-11T21:27:34.767 回答
-2

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

如果即使您将其变为 true/ 或多次,它都会为您提供一条解决方案/而不是多个解决方案 - 基本上就这么简单。

于 2018-12-25T05:10:51.100 回答
-2

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

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

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

于 2019-10-22T07:54:48.973 回答
-4

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

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

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

于 2019-09-04T05:48:48.967 回答