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'超出范围'错误的主要内容,如果未能解决你的问题,请参考以下文章