我已经知道使用“var”和不使用“var”来声明 Javascript 变量的区别。使用“var”可确保变量在代码块的本地范围内严格作为不同的实体存在,而不使用“var”将有效地使变量成为全局变量。我也知道,如果你在全局级别声明一个变量,你是否使用“var”都没有关系。
所以我的问题是,是否有过不使用“var”声明变量更好的情况?
到目前为止,我的印象是总是使用“var”来声明一个变量是没有坏处的。有例外吗?
我已经知道使用“var”和不使用“var”来声明 Javascript 变量的区别。使用“var”可确保变量在代码块的本地范围内严格作为不同的实体存在,而不使用“var”将有效地使变量成为全局变量。我也知道,如果你在全局级别声明一个变量,你是否使用“var”都没有关系。
所以我的问题是,是否有过不使用“var”声明变量更好的情况?
到目前为止,我的印象是总是使用“var”来声明一个变量是没有坏处的。有例外吗?
并不真地。事实上,在严格模式下,您不能在没有范围或 var 的情况下声明变量。所以,如果你试图声明一个全局变量,你必须做类似的事情window.foo = "bar"
;
当然,window.foo
实际上是“在窗口对象上设置一个属性”......所以它甚至没有真正初始化一个变量。
您的问题假设您确实可以控制您的变量声明是否是“初始”声明。如果您确实拥有该控件,那么就没有理由不使用,var
除非您在函数内部工作并且特别想要访问全局变量而不是创建局部变量。在这种情况下,您不能使用var
,否则该变量将成为局部变量,并且您永远无法从该函数中访问具有相同名称的全局变量。
当您在全局范围内使用变量时,如果使用 var 两次声明相同的变量名,您在技术上会出错。有时无法控制这种情况的发生,这就是为什么您会遇到“无法”使用的情况var
。
更新:我指的错误类型是这样的:error: Identifier 'x' has already been declared
这不再发生(谢天谢地)。在 1990 年代后期 JavaScript 还是新出现时,这种情况经常发生。也许这是浏览器实现的错误。以这种速度,不必再担心重新声明变量var
了。let
(仍然不允许使用 with 重新声明变量。对于let
关键字,Redeclaring the same variable within the same function or block scope raises a SyntaxError.
)
让我解释一下“不能”这个词背后的实践历史:
从老式的“Hit-o-Meter”脚本开始,JavaScript 程序员开始注意到,当页面中的许多不同脚本元素可能使用“狂野”时,他们的脚本会生成错误消息(对于任何查看控制台的人)相同的全局变量。避免出现错误的解决方案是简单地不声明变量。(当变量被第一次赋值隐式声明时,会出现警告,但是页面上许多地方的多个变量声明发生的所有其他错误都会消失。所以这是一个较小的邪恶与更大的邪恶。)
如果您可以完全控制页面中的所有脚本,那么您将拥有完全控制权,正如您所说的“最初声明一个 JavaScript 变量”。例如,您可以var
在顶部脚本中声明全局变量时使用,但不能var
在页面稍后的另一个脚本元素中使用相同变量时使用。
如果您无法控制之前是否已经声明了同名的变量,并且如果您不想犯下使用从未被先前脚本元素初始化的全局变量可能带来的恶果,那么您可以选择使用“self”的属性或其他方便的窗口或文档属性。例如,我将编写self.variable = 1
,它不会出现与重新定义变量相关的任何问题。无论此变量是第一次使用还是在页面上的另一个脚本使用后被我的脚本重新使用,都不会生成错误或警告。
(注意:目前self
和window
被认为是等效的,但是在框架集时代有一段时间,它被认为是self
用于存储任何全局变量/属性的更好样式——而且它还节省了一点代码。)
如果您在全局范围内,则没有区别。
如果你在一个函数中,那么“var”将创建一个局部变量,“no var”将查找作用域链,直到找到变量或到达全局作用域(此时它将创建它)。
如果你没有做作业,那么你需要使用 var:
var x; // Declare x
有时您不必使用 var 来访问或更改某些全局(window.variable)变量。