JavaScript总结: javascript中使用var定义变量的变量提升问题

简介: JavaScript总结: javascript中使用var定义变量的变量提升问题

一、问题


我们知道当局部变量和全局变量同名时,局部变量会覆盖局部变量.

但是有时在实际应用JavaScript时,却会发现明明我给变量赋值了,为什么之后在函数调用的时候却输出变量是undefined.

同样遇到问题的我,发现了js中的坑 : 变量提升.


二、变量提升


我们先看一段js代码:

  var scope = "全局变量";
  function test()
  {
    document.writeln(scope + "<br >");
    var scope = "局部变量";
    document.writeln(scope + "<br >");
  }
  test();

运行结果:

20190223220201321.png


按照我们正常的思路,输出应该是:

全局变量

局部变量

实际我们发现第一个输出是undefined,

这里我们就要理解JavaScript的变量提升机制.


所谓变量提升,指的是变量声明总会被解释器"提升"到函数的顶部.

即上面代码等价于

  var scope = "全局变量";
  function test()
  {
    var scope;
    document.writeln(scope + "<br >");
    var scope = "局部变量";
    document.writeln(scope + "<br >");
  }
  test();


这样我们就会明白为什么第一个输出是undefined了.

注意: 如果对于全局作用于范围的变量,var与不var是有区别的:

没有var的写法,其变量不会被提升。

比如下面两个程序,第二个会报错:


alert(a);
var a=1;
alert(a);
a=1;

分别运行结果:

20190223222551474.png


20190223222437452.png

总结:


变量提升就是var在函数内部使用的时候,在var定义变量的语句之前是访问不到变量的! 所以避免预防的方法就是尽量不使用同名的变量名命名并且在函数头部定义变量并赋值。

目录
相关文章
|
1天前
|
JavaScript 前端开发
JavaScript语法关键点:变量用`var`、`let`、`const`声明
【6月更文挑战第22天】JavaScript语法关键点:变量用`var`、`let`、`const`声明;七种数据类型包括`Number`、`String`、`Boolean`、`Null`、`Undefined`、`Symbol`和`Object`;运算符如算术、比较、逻辑和赋值;流程控制有`if...else`、`switch`和各种循环。了解这些是JS编程的基础。
10 3
|
4天前
|
设计模式 JavaScript 前端开发
JS 代码中变量和函数的正确写法总结
**代码规范与最佳实践摘要** 1. 使用可读性强的变量名,如`currentDate`代替`yyyymmdstr`。 2. 对同一类型变量使用相似命名,如`getUser()`代替`getUserInfo()`。 3. 变量名应具有描述性,避免使用难以理解的数字,如`MILLISECONDS_IN_A_DAY`代替`86400000`。
19 2
|
6天前
|
自然语言处理 JavaScript 前端开发
【JavaScript】JavaScript基础知识强化:变量提升、作用域逻辑及TDZ的全面解析
【JavaScript】JavaScript基础知识强化:变量提升、作用域逻辑及TDZ的全面解析
11 3
|
9天前
|
JavaScript 前端开发
JavaScript变量的特殊情况
JavaScript变量的特殊情况
|
24天前
|
JavaScript
JS判断变量是不是数组?方法大全!
JS判断变量是不是数组?方法大全!
|
6天前
|
JavaScript
JS 块级作用域、变量提升
JS 块级作用域、变量提升
|
1月前
|
JavaScript 前端开发
Symbol在JavaScript中还有哪些内置的Symbol可以用于定义特定的方法或属性
Symbol在JavaScript中还有哪些内置的Symbol可以用于定义特定的方法或属性
|
30天前
|
JavaScript 前端开发 Java
javascript是弱类型语言,一个函数参数可以接收不同类型的变量作为它的该参数
javascript是弱类型语言,一个函数参数可以接收不同类型的变量作为它的该参数
30 0
|
10天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的校园竞赛管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的校园竞赛管理系统附带文章源码部署视频讲解等
160 63
|
10天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的小型医院医疗设备管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的小型医院医疗设备管理系统附带文章源码部署视频讲解等
25 6