本文深入解析JavaScript中全局变量使用var声明与不使用var声明的区别。主要差异在于:通过var定义的全局属性具有不可删除性,且会触发变量提升机制;而不使用var直接赋值则会沿作用域链查找,最终挂载到window对象上且不会提升。
全局变量的创建方式
全局变量是开发者熟悉的概念。在函数作用域内,若直接通过 a=1 的形式赋值而未使用 var 声明,该变量将自动成为全局变量。而在全局作用域中,存在三种方式可以创建对全局可见的命名变量。
示例代码如下:
<script>
var a = 1;
b = 2;
window.c = 3;
</script>对于 b=2 这种写法,其机制与 window.c=3 类似。在执行该赋值语句时,JavaScript 引擎会沿着作用域链向上查找名为 b 的变量。若直至作用域链顶端(即全局对象)仍未找到该变量,引擎便会在全局对象(如浏览器中的 window)上添加一个名为 b 的属性,并将其赋值为 2。
var与非var的核心区别
使用 var 声明与不使用 var 声明全局变量,主要存在以下两点区别:
1. 不可删除性:通过 var 声明的全局变量无法被 delete 操作符删除。这是因为 var 定义的全局属性会被标记为不可配置(non-configurable)。需要注意的是,执行 delete 操作时,即使删除失败也不会抛出错误,delete 操作符会返回 false;若成功删除则返回 true。
2. 变量提升机制:通过 var 声明的全局变量会经历变量提升(hoisting),即变量声明会被提升到当前作用域的顶部;而不使用 var 声明的全局变量则不会发生提升。具体执行结果对比如下:
使用 var 声明的代码示例:
<script>
alert(a);
var a=1;
</script>不使用 var 声明的代码示例:
<script>
alert(a);//error, a undefined
a=1;
</script>