在这种情况下,如何使JavaScript以更直观的方式失败

在这种情况下,如何使JavaScript以更直观的方式失败,javascript,Javascript,这是一个SSCCE 考虑以下代码: <html> <head> <script type="text/javascript"> window.addEventListener("load", eventWindowLoaded, false); var eventWindowLoaded = function () { console.log('event window loaded'); };

这是一个SSCCE

考虑以下代码:

<html>
  <head>
    <script type="text/javascript">
     window.addEventListener("load", eventWindowLoaded, false);
     var eventWindowLoaded = function () {
       console.log('event window loaded');
     };
    </script>
  </head>
  <body>
  </body>
</html>

它不起作用,但问题不是如何修复它。相反,问题是为什么JavaScript在尚未分配eventWindowLoaded变量的情况下如此安静地失败。在Chrome中调试时,我在控制台上看不到任何打印内容,也没有任何迹象表明出现了问题。代码只是默默地失败了。我必须使用哪些选项/工具来确保在开发JavaScript时失败得更加惊人?严格使用;也不执行任何操作。

eventWindowLoaded变量被挂起,因此当调用window.addEventListener方法时,该变量将作为未定义传递。在内部,必须将事件侦听器设置为安静地忽略未定义或null方法。

将挂起eventWindowLoaded变量,因此当调用window.addEventListener方法时,该变量将作为未定义传递。在内部,事件侦听器必须设置为安静地忽略未定义或空方法。

这里没有任何错误

如果使用函数声明而不是函数表达式,代码将按预期工作

 window.addEventListener("load", eventWindowLoaded, false);
 function eventWindowLoaded () {
   console.log('event window loaded');
 };
我不想解释,但要仔细阅读

在页面加载时,不会将示例中的函数表达式提升到顶部。但是,函数声明是无效的

因此,在加载事件调用eventWindowLoaded时,它是未定义的


因此,要么使用函数声明,要么将函数表达式放在加载事件上方。

这里没有任何错误

如果使用函数声明而不是函数表达式,代码将按预期工作

 window.addEventListener("load", eventWindowLoaded, false);
 function eventWindowLoaded () {
   console.log('event window loaded');
 };
我不想解释,但要仔细阅读

在页面加载时,不会将示例中的函数表达式提升到顶部。但是,函数声明是无效的

因此,在加载事件调用eventWindowLoaded时,它是未定义的


因此,要么使用函数声明,要么将函数表达式放在加载事件上方。

正如您似乎知道的那样,通过否决票判断,您知道代码不起作用的原因。因此,为了确保JS更出色地失败,您可以将代码更改为:

 window.addEventListener("load", eventWindowLoaded || function(){ throw new Error('An error message'    )}, false);

正如您似乎知道的那样,通过否决票判断,您知道代码不起作用的原因。因此,为了确保JS更出色地失败,您可以将代码更改为:

 window.addEventListener("load", eventWindowLoaded || function(){ throw new Error('An error message'    )}, false);

看看eslint之类的工具:它允许您定义规则,例如在分配变量之前不使用变量,如果您不遵守这些规则,则会抛出错误。由于变量提升,变量已经存在,因此您的代码在技术上不包含错误,我附和@nils的注释——代码本身并没有失败——它的性能与编写的完全一样。这些问题最好在开发阶段使用静态分析器,而不是在运行时使用。对于这个特定的问题,jslint显示“eventWindowLoaded”超出了范围。@JamesThorpe我很乐意接受一个与您的评论具有相同效果的答案,并提供一些静态分析工具的链接。目前我无法安装eslint,而jslint似乎是基于web的,没有CLI,因此我不确定如何将其集成到构建中。我会,但我认为这个问题/这样的答案出于工具推荐的原因,与主题无关。看看像eslint这样的工具:它允许您定义规则,例如在分配变量之前不使用变量,如果您不遵循这些规则,则会抛出错误。变量已经存在,这是由于变量提升,因此,从技术上讲,您的代码不包含错误,它什么也不做。我支持@nils的注释—代码本身并没有失败—它的性能与编写的完全一样。这些问题最好在开发阶段使用静态分析器,而不是在运行时使用。对于这个特定的问题,jslint显示“eventWindowLoaded”超出了范围。@JamesThorpe我很乐意接受一个与您的评论具有相同效果的答案,并提供一些静态分析工具的链接。目前我无法安装eslint,而jslint似乎是基于web的,没有CLI,因此我不确定如何将其集成到构建中。我会,但是我认为这个问题/这样的答案对于工具推荐来说是一个离题的问题。问题是,在开发JavaScript时,我必须确保哪些选项/工具比这更显著地失败?你的答案只是解释了为什么代码不起作用。问题是,在开发JavaScript时,我必须确保哪些选项/工具比这更显著地失败?你的答案只是解释了代码不起作用的原因。这个答案也是在修复代码,而不是首先显示一种检测代码是否存在逻辑错误的方法。这个答案也是在修复代码,而不是显示一种检测代码是否存在逻辑错误的方法 e首先有逻辑错误。