var num=10;
fun();
function fun(){
consonle.log(num);
var num=20;
}
请问为什么输出的num 不是等于10而是undefied;num=10不是全局作用域吗,为什么函数内部不是使用
终于明白了!!
根据作用域链,console.log(num)输出的num会先查找function里面声明的var num;而此时num没有定义,所以返回的是undefied
因为函数外部是全局作用域,函数内部是函数作用域,函数作用域内num变量提升,等于先声明,在console下面被赋值成20,console输出时先找自身作用域找到num输出,函数内部没有定义这个变量它才会去外面寻找,读取变量会优先在自身作用域中寻找
var num=10;
fun(num);
function fun(num){
consonle.log(num);
var num=20;
}
这样就可以了,哈哈哈,答非所问
方法体是个独立的作用域,独立解析内部js代码,内部没有时,再往上找
console.log(num);
var num=20;
解析器先读取声明赋值undefined,再逐行执行
var num=10;
fun();
function fun(){
var num
consonle.log(num);
num=20;
}
你可以把程序看成上面的样子,fun函数内部先检索到了内部的num声明,在打印的时候num已经声明但是还未定义,所有打印出来是undefined
很好奇,你写个consonle还能打印出来的?
它的作用域链是这样的,代码执行前一刻会有一个预编译环节,预编译环节中先生成的全局作用域的GO{num :undefined,fun:undefined}然后是fun函数自己的AO{num:undefined}这是预编译环节产生的作用域链,再执行就从上到下,在fun函数内部,num= 20是在console.log之后的,所以当访问是访问到的是已经声明但并未赋值的num,所以结果是undefined