前置知识
- 在ES5当中,变量的作用域只有全局作用域和函数作用域之分的,也就是说,你使用 var 关键字创建的变量,要么是全局都可以使用的,要么就是函数内部可以使用的
- 在ES5当中,var定义的变量是会变量提升的
- 在ES6当中,let是块级作用域,不会变量提升
于是乎产生了一次错误
<script>
var data='动感超人'
if(data){
var flag=true;
}
console.log(flag);//输出结果为true
</script>
这一段代码一看就是true
-
在js当中,除了 null undefined “” NaN false 这四个转化为布尔值为false,其他均为true
-
所以data="动感超人"转化为布尔值为true~所以执行var flag=true;
-
由于var只有全局作用域和函数作用域,所以var flag为全局变量
代码改改
<script>
var data=''
if(data){
var flag=true;
}
console.log(flag);
</script>
这一段代码呢?
结果为undefined
分析
执行流程
1.js引擎执行js代码前先看看有没有可以变量提升,函数提升),上面代码转换下实际上是这样子在执行的过程中
<script>
var data;//变量提升
var flag;//变量提升
data=''//赋值
if(data){//转布尔值为false
flag=true;//条件不成立,不执行赋值
}
console.log(flag);//没有赋值,又为全局变量,不报错,但是输出为undefined
</script>