我怎样才能像 PHPexit
或一样退出 JavaScript 脚本die
?我知道这不是最好的编程实践,但我需要这样做。
24 回答
“退出”函数通常会退出程序或脚本,并带有错误消息作为参数。例如 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
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 '';
}
即使在没有句柄、事件等的简单程序中,最好将代码放在“主”函数中,即使它是唯一的过程:
<script>
function main()
{
//code
}
main();
</script>
这样,当你想停止程序时,你可以使用“return”。
如果您不在乎这是一个错误,只需编写:
fail;
这将阻止您的主要(全局)代码继续进行。对于调试/测试的某些方面很有用。
有很多方法可以退出 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
退出。
将debugger;
关键字放在要停止执行的 JavaScript 代码中。然后打开您喜欢的浏览器的开发者工具并重新加载页面。现在它应该会自动暂停。打开工具的Sources部分:debugger;
关键字突出显示,您可以选择恢复脚本执行。
我希望它有所帮助。
更多信息请访问:
就我而言,我使用了window.stop
.
停止在当前浏览上下文中
window.stop()
进一步加载资源,相当于浏览器中的“停止”按钮。由于脚本的执行方式,此方法不能中断其父文档的加载,但会停止其图像、新窗口和其他仍在加载的对象。
用法:(来源)
window.stop();
_
可以在 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);
}
$.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,请将源代码复制粘贴到控制台中。
可能还有别的东西。在评论中告诉我。
在 JavaScript 中有多种方式,下面是其中的一些
方法一:
throw new Error("Something went badly wrong!");
方法二:
return;
方法三:
return false;
方法四:
new new
方法五:
使用上述方法编写您的自定义函数并在您需要的地方调用
注意: 如果您只想暂停代码执行,您可以使用
debugger;
如果您正在寻找一种方法来强制终止页面上所有 Javascript 的执行,我不确定是否有官方认可的方法来做到这一点——这似乎是一种可能存在安全风险的事情(尽管老实说,我想不出我怎么会想到它)。通常在 Javascript 中,当您希望代码停止运行时,您只需return
执行正在执行的任何函数即可。(return
如果它是函数中的最后一件事并且函数不应返回值,则该语句是可选的)如果有某种原因返回对您来说不够好,您可能应该在问题中编辑更多细节,说明您为什么认为您需要它,也许有人可以提供替代解决方案。
请注意,在实践中,大多数浏览器的 Javascript 解释器在遇到错误时会简单地停止运行当前脚本。因此,您可以执行诸如访问未设置变量的属性之类的操作:
function exit() {
p.blah();
}
它可能会中止脚本。但是你不应该指望它,因为它根本不是标准的,而且它看起来真的是一种糟糕的做法。
编辑:好的,鉴于 Ólafur 的观点,这可能不是一个很好的答案。虽然die()
他链接的函数基本上实现了我的第二段,即它只是抛出一个错误。
扔 ””;
是对概念的误用,但可能是唯一的选择。而且,是的,您将不得不重置所有事件侦听器,就像接受的答案提到的那样。如果我是对的,您还需要一个单一的入口点。
最重要的是:您想要一个页面一旦抛出就通过电子邮件向您报告 - 您可以使用例如 Raven/Sentry 来实现此目的。但这意味着,您会产生误报。在这种情况下,您还需要更新默认处理程序以过滤掉此类事件或在 Sentry 的仪表板上将此类事件设置为忽略。
窗口.stop();
这在页面加载期间不起作用。它也停止对页面的解码。因此,您不能真正使用它为用户提供页面的无 javascript 变体。
调试器;
仅在打开调试器时停止执行。效果很好,但不是可交付成果。
我知道这是旧的,但如果你想要一个类似的 PHPdie()
函数,你可以这样做:
function die(reason) {
throw new Error(reason);
}
用法:
console.log("Hello");
die("Exiting script..."); // Kills script right here
console.log("World!");
上面的例子只会打印“Hello”。
这个小函数非常接近于模仿 PHP 的 exit()。与其他解决方案一样,不要添加任何其他内容。
function exit(Msg)
{
Msg=Msg?'*** '+Msg:'';
if (Msg) alert(Msg);
throw new Error();
} // exit
如果您在脚本中使用任何未定义的函数,则脚本将因“未捕获的 ReferenceError”而停止。我尝试了以下代码并执行了前两行。
我认为,这是停止脚本的最佳方式。如果还有其他方法,请评论我。我也想知道另一种最好最简单的方法。顺便说一句,我没有在像 PHP 这样的 Javascript 中退出或终止内置函数来终止脚本。如果有人知道,请告诉我。
alert('Hello');
document.write('Hello User!!!');
die(); //Uncaught ReferenceError: die is not defined
alert('bye');
document.write('Bye User!!!');
如果您只想停止进一步的代码执行而不“抛出”任何错误,您可以临时覆盖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.");
我正在使用 iobroker 并且很容易设法停止脚本
stopScript();
此代码将停止当前窗口中所有 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>
要停止脚本执行而不会出现任何错误,您可以将所有脚本包含到一个函数中并执行它。
这是一个例子:
(function () {
console.log('one');
return;
console.log('two');
})();
上面的脚本只会记录一个.
使用前
- 如果您需要在脚本本身之外读取脚本的函数,请记住(通常)它不起作用:为此,您需要使用预先存在的变量或对象(您可以将函数放在窗口对象)。
- 上面的代码可能是您不想要的:将整个脚本放在一个函数中可能会产生其他后果(例如,这样做,脚本将立即运行,并且在开发过程中无法从浏览器修改其部分,据我所知,在 Chrome 中)
在大多数情况下不适用,但我在浏览器中运行了很多异步脚本,并且作为黑客我做
window.reload();
停止一切。
这是一个示例,如果存在条件,则终止脚本。我在我的 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 脚本
只需创建一个 BOOL 条件,这里不需要复杂的代码..
如果即使您将其变为 true/ 或多次,它都会为您提供一条解决方案/而不是多个解决方案 - 基本上就这么简单。
我使用这段代码来停止执行:
throw new FatalError("!! Stop JS !!");
你会得到一个控制台错误,但它对我很有用。
我使用 return 语句而不是 throw,因为 throw 在控制台中给出错误。最好的方法是检查条件
if(condition){
return //whatever you want to return
}
这只是从该行停止程序的执行,而不是在控制台中给出任何错误。