是否可以停止JavaScript执行?

Ind*_*ial 282 javascript

是否有可能以某种方式停止或终止JavaScript,以防止任何进一步的基于JavaScript的执行发生,而无需重新加载浏览器?

我在想exit()PHP 中的JavaScript等价物.

小智 495

简短回答:

throw new Error("Something went badly wrong!");
Run Code Online (Sandbox Code Playgroud)

如果您想了解更多,请继续阅读.


你想阻止JavaScript执行开发/调试吗?

debugger;代码中的表达式将停止页面执行,然后浏览器的开发人员工具将允许您在页面冻结时查看页面状态.

您是否想要任意设计停止您的应用程序?

出错了?

而不是试图阻止一切,让你的代码处理错误.Exception通过谷歌搜索阅读s.它们是一种智能的方法,可让您的代码"跳转"到错误处理过程,而无需使用繁琐的if/else块.

在阅读完它们之后,如果您认为中断整个代码绝对是唯一的选择,那么除了应用程序的"根"范围外,抛出一个不会被"捕获"的异常就是解决方案:

// creates a new exception type:
function FatalError(){ Error.apply(this, arguments); this.name = "FatalError"; }
FatalError.prototype = Object.create(Error.prototype);

// and then, use this to trigger the error:
throw new FatalError("Something went badly wrong!");
Run Code Online (Sandbox Code Playgroud)

确保你没有catch()能够捕获任何异常的块; 在这种情况下修改它们以重新抛出"FatalError"异常:

catch(exc){ if(exc instanceof FatalError) throw exc; else /* current code here */ }
Run Code Online (Sandbox Code Playgroud)

任务完成或任意事件发生时?

return; 将终止当前函数的执行流程.

if(someEventHappened) return; // Will prevent subsequent code from being executed
alert("This alert will never be shown.");
Run Code Online (Sandbox Code Playgroud)

注意:return;仅在函数内有效.

在这两种情况下......

...您可能想知道如何停止异步代码.它完成了clearTimeoutclearInterval.最后,要停止XHR(Ajax)请求,您可以使用该xhrObj.abort()方法(也可以在jQuery中使用).

  • 注意:所有剩余的异步函数,如`setTimeout`或`XMLHttpRequest`仍将执行.目前还没有完全终止JavaScript的*标准*方法. (14认同)
  • 如果您需要停止整个JS进程以进行调试,请使用Webkit中的Developer Tools或Firefox上的Firebug通过`debugger;`来设置断点.这将完全停止执行所有事情. (8认同)
  • `debugger;`语句为+1.`return`外部函数会产生语法错误(只是为了冲浪者).有很多方面需要考虑......我只是通过接受我不想用`if(false){...}`执行的部分来获得成功.所以你不必关心嵌套的注释. (5认同)
  • @Derek 朕会功夫`调试器`非常适合在有大量异步内容发生时阻止页面加载,但是如果可以摆脱半透明的灰色覆盖层并同时在页面中滚动,那就太好了. (2认同)

Bar*_*xto 110

你可以写一个JavaScript拼写错误:D(在这里开箱即用)

thisFunctionDoesNotExistAndWasCreatedWithTheOnlyPurposeOfStopJavascriptExecutionOfAllTypesIncludingCatchAndAnyArbitraryWeirdScenario();
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

new new
Run Code Online (Sandbox Code Playgroud)

  • 你先生,是个天才!:) (37认同)
  • 从现在开始,我将在我写的所有内容中包含此功能,让模因创建! (15认同)
  • 你值得一个饼干. (9认同)
  • 使用JavaScript作为脚本语言时,这并不常用.正在运行的代理将其捕获为运行时错误,并且在您将其更改为函数(存在)调用或抛出错误之前不会前进.但是很棒的主意.此外,您可能认为它应该是驼峰式的,所以在您真正希望它坚持下去的情况下不需要进行评论.我想这样的事情:`fakeFunctionThatEffectivelyStopsAllProcessingInJavaScript();`.谢谢. (6认同)
  • 我试图拦截异步JS中间的对象,它包含在catch-every-exception和redirect中,没有任何选项可以手动停止所有异步操作或更改catch/redirect部分.编写`abcd`帮助:脚本编译但落在这里'未定义'运行时错误!非常感谢,这应该是答案. (4认同)
  • 现在,这是在框外思考.有意为语法错误! (3认同)
  • 只需确保在代码中解释这一行即可。如果有人在你看到这一行之后,他会很困惑:) (2认同)
  • 脱帽...来自一个不戴任何帽子的人:)自切片面包以来的最佳答案:) (2认同)

Mik*_*y G 32

像这样的东西可能会起作用:

function javascript_abort()
{
   throw new Error('This is not an error. This is just to abort javascript');
}
Run Code Online (Sandbox Code Playgroud)

取自这里:

http://vikku.info/codesnippets/javascript/forcing-javascript-to-abort-stop-javascript-execution-at-any-time/

  • http://www.ecma-international.org/ecma-262/5.1/#sec-15.11 (2认同)

小智 23

没有.

即使你抛出一个异常,它也只会杀死当前的事件循环.传递给setTimeout或DOM/XMLHttpRequest事件处理程序的回调仍将在它们到来时运行.

  • 我们怎么能阻止这种情况? (5认同)
  • 在我阅读你的帖子之前,我做了超时测试.它确认异常不会终止时间.https://jsfiddle.net/skibulk/wdxrtvus/ (2认同)

use*_*569 17

我做:

setTimeout(function() { debugger; }, 5000)
Run Code Online (Sandbox Code Playgroud)

这样我有5秒钟与UI交互,然后停止.我使用的Las时间是当我需要保持自定义工具提示可见时,做一些样式更改.

  • 这是(几乎)唯一满足问题中“以某种方式阻止任何基于 JavaScript 的执行发生”子句的答案。但是,它缺少仅在开发者控制台打开时才起作用的信息,不需要超时,并且可以手动恢复(这是暂停而不是停止)。 (3认同)

Ton*_*ony 14

我在用

return false;

如果我想从JavaScript中止进一步向下运行.

  • 你不需要虚假...只需返回; (12认同)
  • 如果是ajax调用,则不会停止.我的意思是你有一个函数在ajax获取data.return之后执行或返回false只退出该函数,而不是你想要停止的方法,如果ajax失败. (2认同)

Dio*_*ane 9

如果你在一个函数中,你可以使用它退出它,return;但这不会停止执行调用该函数的父函数.


ben*_*tah 8

您可以return在函数中提前调用,至少该函数将停止运行.您也可以使用它throw ''来导致错误并停止当前进程.但这些并不能阻止一切.setTimeout并且setInterval可以分别使得在一个时间间隔上运行的延迟函数和函数.那些将继续运行.Javascript事件也将继续像往常一样工作.


Cos*_*min 5

我知道这已经过时了,但我想这样做,并且在我看来,我发现了一个稍微改进的抛出答案的解决方案。只是暂时抑制错误消息并稍后使用 setTimeout 重新激活它们:

setTimeout(function() {
    window.onerror = function(message, url, lineNumber) {  
        return false;
    };
}, 50); // sets a slight delay and then restores normal error reporting
window.onerror = function(message, url, lineNumber) {  
    return true;
};
throw new Error('controlledError');
Run Code Online (Sandbox Code Playgroud)