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