题
我怎么可以退出JavaScript脚本很像PHP的 exit
或 die
?我知道这不是最好的编程的做法,但我需要。
解决方案
JavaScript的等效PHP的die
。 BTW它只是调用 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 '';
}
其他提示
“退出”的功能,通常退出该程序或脚本作为paramete错误消息一起。例如管芯(...)在PHP
die("sorry my fault, didn't mean to but now I am in byte nirvana")
在JS等效是,作为出错信号的抛强>关键字是这样的:
throw new Error();
可以很容易地测试此:
var m = 100;
throw '';
var x = 100;
x
>>>undefined
m
>>>100
即使在无柄,事件和这样简单的程序,它是最好将代码放在一个“主”函数,即使当它是唯一的过程:
<script>
function main()
{
//code
}
main();
</script>
这样,当你想停止的程序,你可以用“回归”。
有许多方式以退出JS或节点脚本。下面是最相关的:
// 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
退出。
如果你不介意,这是一个错误只是写:
fail;
这将继续停止你的主要(全球)代码。 可用于调试/测试的某些方面。
地方的 debugger;
关键在JavaScript code你想要停止执行。然后打开你最喜欢的浏览器的开发工具和重新载入页面。现在它应该暂停。打开的 来源 部分的你的工具:的 debugger;
关键词是强调和你有选择继续执行的脚本。
我希望这有所帮助。
更多信息:
在我的情况下我用 window.stop
API是像点击浏览器上的X按钮:
window.stop();
这个答案提供了相关细节表明额外的框架,这将有助于解决这个问题和其他提前退场,异常,过程控制和模块化JavaScript的顺序功能的处理需求。解决方案提供了封闭的例子。这个回答假设个人想在页面上其他脚本继续有问题的脚本退出后运行。
这里简单的解决方案的实时例如: https://jsfiddle.net/alignedfibers/cpe1o1yy/66 /
<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>
以上是“CallRunner”,提供了一个非常简单的方法只是通过你的函数亚军退出是免费的。
在小提琴的变量命名可能会产生混淆,命名为“好玩”的功能是内safetyRun用来引用我们正试图退出该功能的名称,exitErr是用来参考我们运行实际完成的功能名称出口。也有点困惑的是:一旦exitErr完成后,堆栈帧仍然没有从控制线程调用,我们退出的功能释放。因为我们仍然有控制,我们可以使用的功能或错误代码的线程被推到在exitErr功能的阵列,并返回允许任何其他功能运行之前itteratively给他们打电话。这使我们能够改变任何重量或改正或者设置任何状态需要,我们可以用它来提醒什么纠错状态需要注意,发送日志报告甚至完全具有挑战性的清理和自主修复后台功能和itteratively调用exitErr直到它完成回归,而不是抛从而使功能我们试图退出早完成,(建议做此offmainthread)。这种“包装/线束”可能是验证版本的浏览器之类的东西,在一个函数的一个良好的开端,你甚至可以做一个静态或动态的进口在这里,如果你管理自己的库或什么都你真的可以想到的。出口只有一个fundemental功能,可以通过包装它像这样进行供您的功能。
在小提琴的代码是一个有点脏,不漂亮,新ES6结构可以使这个更漂亮。此外,我建议你在这个函数的调用顶部线束发电机及其结果分配给这样的功能要退出可以看起来更像下面的代码一个局部变量。为了保持控制线程不释放堆栈,你仍然需要需要有一个harness.run(函数(线束){/的 MyVanillaFunc 的/})来包装你的香草功能,否则下面在理论上应该工作。包装正是我所做的exitEarly码以上。
var rockStarFunction = new function (){
var harness = reducePublicStrapOnFromCache()._url(location);
return function(){ /*wrapper would wrap these internals*/
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;
};
}
我在这里提供的解决方案是一个我建议,如果你的目的是要建立与功能,如出口,断言,模拟和这样建在JavaScript亚军容器。我认为这是建立这个集装箱的更好的办法并让我的功能传递。
如果你正在寻找一种方式来强制终止一个页面上所有的Javascript执行,我不知道有一个官方认可的方式做到这一点 - 它似乎像这样的事情,可能会带来安全隐患(不过说实话,我不认为它会怎样把我的头顶部)。通常,在Javascript中当你想你的代码停止运行,您刚刚从任何函数执行return
。 (该return
语句是可选的,如果它在功能上的最后一件事和函数不应该返回一个值),如果有某种原因,返回是不是你不够好,你应该编辑详细到了一个问题,为什么你认为你需要它,也许有人可以提供一个替代的解决方案。
请注意,在实践中,大多数浏览器的JavaScript解释器将简单地停止运行当前的脚本,如果他们遇到一个错误。所以,你可以这样做访问未设置变量的属性:
function exit() {
p.blah();
}
和它的可能的中止脚本。但你不应该指望的是,因为它不是在所有的标准,它确实似乎是一个可怕的做法。
修改的:好吧,也许这是不是在奥拉维尔的光这样一个很好的答案。虽然他链接的die()
功能基本上实现我的第二段,即它只是引发错误。
更新:这工作,只要你不catch
它
throw window.location.assign('dead.html');
这个小功能显得相当接近模仿PHP的退出()。至于其他的解决方案,不添加任何东西。
function exit(Msg)
{
Msg=Msg?'*** '+Msg:'';
if (Msg) alert(Msg);
throw new Error();
} // exit
简单地创建一个BOOL条件, 不需要复杂这里代码..
如果即使一旦你把它转化为真/或多次, 它会既给你解决一个线/不是多个 - 基本上简单。
掷 “”;
是概念的误用,但可能是唯一的选择。而且,是的,你将不得不重置所有事件侦听器,就像接受的答案提及。您还需要一个入口点,如果我是正确的。
在它的顶部:你想一个网页,其中通过电子邮件,只要它抛出报告给你 - 你可以使用例如乌鸦/哨兵这一点。但是,这意味着,你自己产生误报。在这种情况下,您还需要更新默认处理程序来过滤这些事件出来或忽略哨兵的仪表盘设置这样的事件。
window.stop();
这不会在页面加载过程中工作。它停止页面的解码,也支持。所以,你真的不能用它来提供用户网页的免费的JavaScript变的。
调试器;
停止执行仅与调试器打开。工作很大,但不是一个可交付。
如果您在脚本中使用任何未定义功能,那么脚本将停止因“未捕获的ReferenceError”。我已经通过下面的代码并执行前两行尝试。
我想,这是阻止脚本的最佳方式。如果有任何其他方式然后请评论我。我也想知道另一个最好的和简单的方法。顺便说一句,我没有退出或死亡内置函数在Javascript中,如PHP的终止脚本。如果有人知道,那么请让我知道。
alert('Hello');
document.write('Hello User!!!');
die(); //Uncaught ReferenceError: die is not defined
alert('bye');
document.write('Bye User!!!');
这是一个例子,即, 如果条件存在,则终止脚本。 我在上证所客户端的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脚本