前置知识

  1. 在ES5当中,变量的作用域只有全局作用域和函数作用域之分的,也就是说,你使用 var 关键字创建的变量,要么是全局都可以使用的,要么就是函数内部可以使用的
  2. 在ES5当中,var定义的变量是会变量提升的
  3. 在ES6当中,let是块级作用域,不会变量提升

于是乎产生了一次错误

1
2
3
4
5
6
7
<script>
var data='动感超人'
if(data){
var flag=true;
}
console.log(flag);//输出结果为true
</script>

这一段代码一看就是true

  1. 在js当中,除了 null undefined “” NaN false 这四个转化为布尔值为false,其他均为true

  2. 所以data=”动感超人”转化为布尔值为true~所以执行var flag=true;

  3. 由于var只有全局作用域和函数作用域,所以var flag为全局变量

    代码改改

1
2
3
4
5
6
7
<script>
var data=''
if(data){
var flag=true;
}
console.log(flag);
</script>

这一段代码呢?

结果为undefined

分析

执行流程

1.js引擎执行js代码前先看看有没有可以变量提升,函数提升),上面代码转换下实际上是这样子在执行的过程中

1
2
3
4
5
6
7
8
9
<script>
var data;//变量提升
var flag;//变量提升
data=''//赋值
if(data){//转布尔值为false
flag=true;//条件不成立,不执行赋值
}
console.log(flag);//没有赋值,又为全局变量,不报错,但是输出为undefined
</script>

总结

施主,要小心,小心,再小心~阿弥陀佛