JsLint'超出范围'错误

Posted

技术标签:

【中文标题】JsLint\'超出范围\'错误【英文标题】:JsLint 'out of scope' errorJsLint'超出范围'错误 【发布时间】:2011-01-29 22:06:20 【问题描述】:
function test()
    if(true)
        var a = 5;
    
    alert(a);


test();

当我检查 JsLint 时,我的 JS 代码中不断出现“超出范围”错误,这对我来说毫无意义。所以我快速创建了一个示例。这段代码真的有问题吗,因为变量最终还是被提升到函数的顶部。

【问题讨论】:

JSLint 的许多“错误”实际上只是警告,因为它们不是 javascript 语言错误,在运行时不一定会失败。它们被称为错误,因为 Douglas Crockford 认为它们是不好的做法。 【参考方案1】:

Javascript 有函数作用域而不是块作用域。因此,在 if 函数内部声明的变量在 if 块外部和声明 if 语句的函数内部是可见和可访问的。

像 JSLint 和 jsbin 这样的在线编译器会给出警告,但它们不是错误。

【讨论】:

【参考方案2】:

您编写的代码正在运行。它只是不太可读/可维护。在if 的范围内声明变量a 可能会给人一种错误的印象,即a 仅在此范围内可见(如本程序所示,这是不正确的——a 将在整个范围内可见函数)。

此 JsLint 警告鼓励您将声明放置在实际使用变量的确切范围内,如下所示:

function test()
  var a;
  if(true)
      a = 5;
  
  alert(a);

【讨论】:

大概是一个错字,应该是var a = null 为什么要把它定义为 null 呢? 不需要。仍然可以声明为var a;【参考方案3】:

虽然var 将变量本地化到函数并受到提升,但大多数语言都有块作用域而不是函数作用域。

通过在 if 块内使用 var 关键字,但在该块外访问变量,您创建的结构可能会让不熟悉该 JS 特性的人感到困惑。

Douglas Crockford recommends 在函数顶部使用单个 var 语句,该语句指定应作用于该函数的所有变量。

function test()
    var a;
    if(true)
        a = 5;
    
    alert(a);


test();

如果有多个变量,您将拥有:

function foo () 
    var a, b, c, d = "only d has an initial value", e;
    // …

【讨论】:

Douglas Crockford 推荐了很多 的东西......就像任何工具一样,您应该始终对 JSLint 的建议持保留态度,并为您/您的团队量身定制它们。如果您团队中的每个人都了解 JS 变量作用域的工作原理,那么您无论如何都应该忽略 Crockford 关于放置“var”语句的位置的建议。

以上是关于JsLint'超出范围'错误的主要内容,如果未能解决你的问题,请参考以下文章

Swift 错误:索引超出范围

准备转场时致命错误索引超出范围

UICollectionView 给出“索引超出范围”错误

使订阅超出范围错误

我收到错误:致命错误:索引超出范围

Sonarqube 扫描错误,行超出范围?