alert(i);结果会报错,alert(i);var i = 0;结果是undefined,为什么后者不报错?

xiaochangzai
  • 31

alert(i);//报错,i未定义
alert(i);var i = 0;//undefined

回复
阅读 2.8k
7 个回答

这是因为Javascript并非完全的按顺序解释执行,而是在解释之前会对Javascript进行一次“预编译”,在预编译的过程中,会把定义式的函数优先执行,也会把所有var变量创建,默认值为undefined,以提高程序的执行效率。

alert(i);var i = 0;

var i;
alert(i);
i = 0;

在JavaScript中所有在作用域中var声明的变量会自动提升到该作用域的顶部。不过ES6中let声明变量是不存在声明提升的。javascript是单线程的,代码是一块一块的执行的,一块有时候是一条语句,有时候是{}包起来的代码块,有时候是一小块作用域内的代码。在代码块内,会优先把var变量声明不赋值,所以为undefined。

变量提升
es6 用let关键字可以解除这种烦恼
归根究底是 js太不规范了,坑太多

在js中,会变量提升,然后按顺序执行;

alert(i);var i=0;

其实等价于

var i;
alert(i);
i=0;

变量提升 看下相关资料就知道了

是变量提升在做鬼。

es6引入了块作用域,使用let代替var做变量声明,就不会有变量提升了。

你知道吗?

宣传栏