如何提前退出javascript脚本标签?

Posted

技术标签:

【中文标题】如何提前退出javascript脚本标签?【英文标题】:How to exit javascript script tags early? 【发布时间】:2015-08-18 22:09:27 【问题描述】:

我有一个包含一堆....部分的页面。在其中一个中,我完成了一半并决定要停止,并且不运行此脚本标记的其余内容 - 但仍运行页面上的其他代码段。有没有办法做到这一点将整个代码段包装在一个函数调用中?

例如:

<script type='text/javascript'>
    console.log('1 start');
    /* Exit here */
    console.log('1 end');
</script>
<script type='text/javascript'>
    console.log('2 start');
    console.log('2 end');
</script>

应该产生输出

1 start
2 start
2 end

而不是1 end

显而易见的答案是将脚本包装在一个函数中:

<script type='text/javascript'>
    (function()
        console.log('1 start');
        return;
        console.log('1 end');
    )();
</script>

虽然这通常是最好的方法,但也有不适合的情况。所以我的问题是,如果有的话,还有什么其他方法可以做到这一点?如果没有,为什么不呢?

【问题讨论】:

无条件退出? 我同意@artm 的想法 - 鉴于您(显然)想在没有条件的情况下退出,您当然可以从脚本块中删除 console.log('1 end'); 行!毫无疑问,还有更多内容,所以我建议您添加更多关于 为什么 您尝试退出 js 块的细节。最终,尽管我怀疑最好的方法是围绕设计和构建代码——在这方面使用内联脚本块并不重要;) @NathanRussell 我不确定您是否掌握了“示例”的概念……上面的代码不是实际的生产代码;它只是为了说明情况。在实际的生产系统中,“1 end”部分可能是您有时想要执行的东西而不是其他东西,或者它可能包含在另一个您无法修改的文件中,或者其他情况。我不知道在什么情况下需要这样做;我主要是出于好奇而问,因为我认为这是一个关于 SO 的好问题。 【参考方案1】:

你可以使用break语句:

breakCode : 
  document.write('1 start');
  /* Exit here */
  break breakCode;
  document.write('1 end');

有了标签引用,break语句可以跳出任意代码块


参考

break MDN

【讨论】:

哇,goto 的回归……没想到会这样。 注意:这只存在于 ... 块中,而不是可能定义更多函数等的整个脚本(除非这些函数是在块中定义的,但这会使它们难以访问) 【参考方案2】:

实现所需的一种方法(停止执行给定脚本块,而不将其包装在函数中)是抛出错误。

<script type='text/javascript'>
    console.log('1 start');
    throw new Error();
    console.log('1 end');
</script>

当然,这样做的缺点是它会导致错误被记录到控制台。

【讨论】:

这行不通,因为他的第二个 &lt;script&gt; 标记不会运行。 是的,它会 - 在我写下我的答案(至少在 Chrome 上)之前,我通过测试仔细检查了【参考方案3】:

如果您想使用throw 方法(在@knolleary's answer 中提到)停止脚本标记,但又不会在控制台中抛出错误消息,这里有一个hacky 方法:

<script>
  console.log("This will get logged to console.");
  window.onerror = () =>  window.onerror=undefined; return true; 
  throw 0;
  console.log("This won't.");
</script>

该代码仅使用window.onerror 捕获错误(返回true 隐藏错误)。

如果需要经常使用,当然可以创建一个全局函数:

<script>
  function scriptReturn() 
    window.onerror = () =>  window.onerror=undefined; return true; 
    throw 0;
  
</script>
...
<script>
  console.log("This will get logged to console.");
  scriptReturn();
  console.log("This won't.");
</script>

如果您需要在代码的其他地方使用window.onerror,您可以使用addEventListener

window.addEventListener("error", function(e)  ... )

【讨论】:

以上是关于如何提前退出javascript脚本标签?的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止 Windows 批处理文件提前退出?

网页显示javascript错误..怎么解决

javascript脚本如何异步加载,有啥作用

如何缓存使用脚本标签下载的已下载 javascript 文件

如何在 javascript 脚本标签中使用 razor for 循环?

如何使用javascript包含struts html标签?