fun();
var num = 10;
function fun(){
console.log(num);
var num = 20;
}
结果为什么是undefined?那个大神能说说过程?
var在其作用域内会首先申明赋值undefined,执行到对应的语句才会执行赋值,你这个问题还有个变量作用域的问题,fun中使用的是内部的num,而不是window下的num
等价于下面的
var num =undefined;
fun();
num = 10;
function fun(){
var num =undefined;
console.log(num);
num = 20;
}
我对这个的理解是。
浏览器先解析函数代码块。
因此你的代码如下,先解析了代码块,调用了ab();
在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域。变量提升即将变量声明提升到它所在作用域的最开始的部分。
现在浏览器大部分支持es6语法,少量不支持。那么在块级作用域下面是不存在变量提升的。
当你的代码执行到ab();时,console.log(num)中的num变量是未定义的。
var num=10;
function ab(){
console.log(num);
var num=12;
};
代码的执行分为两个阶段:预解析和逐步执行
预解析:变量声明提升和函数提升
var num;
function fun(){
//函数内预解析
var num;
console.log(num); //这个时候会查找当前作用域的num,只申明没赋值,返回undefined
num = 20;
}
fun();
num=10;
var num;
fun();
num = 10;
function fun(){
console.log(num);
num = 20;
}
应该比较容易理解,变量提升是指变量的提升就是var 其赋值并不会提升,个人理解