详细解决方案
javascript定义全局变量的时候有var和没有var的区别
热度:15 发布时间:2023-10-25 02:39:37.0
首先讨论的范围是在浏览器端的javascript
在平常我们定义一个全局的变量 代码如下:
- var x = 2;
- y = 3;
- console.log(x); //2
- console.log(y); //3
- console.log(window.x);//2
- console.log(window.y);//3
复制代码
可以看出x,y都挂在window下,成为window的一个属性。 这时操作:
这个时候就看到了定义一个全局变量有var和没有var的区别了,即通过var创建的全局变量无法使用delete删除。 那么到底是为什么呢? 在我不使用var定义变量的时候,变量的特性configurable的值为true,可以使用delete对其操作。 使用var定义一个全局变量的时候,变量的特性configurable的值为false,不可以使用delete对其操作。 可以通过下面的代码验证之:
- Object.getOwnPropertyDescriptor(window, 'x'); //Object {value: 2, writable: true, enumerable: true, configurable: false}
复制代码
- Object.getOwnPropertyDescriptor(window, 'y');//Object {value: 3, writable: true, enumerable: true, configurable: true}
复制代码
还有的区别是:
示例代码如下:
- alert(a);var a = 2; //undefined
复制代码
- alert(a);a = 2; //ReferenceError: a is not defined
复制代码
从上面的两段代码分析: var声明的全局变量在javascript代码中会"代码提升"(hoisting), var a = 2被分解为var a; a = 2; 代码parse(解析)的时候var a;会被提升到代码的最前面 ,这个时候 a 为 undefined。在执行到 a=2;的时候再对a 赋值。第二段代码变量没有使用var声明,没有提升,在alert(a)的时候a没有被定义。