首页 新闻 会员 周边 捐助

关于变量提升问题

0
[待解决问题]

var num=10;
fun();
function fun(){
consonle.log(num);
var num=20;
}

请问为什么输出的num 不是等于10而是undefied;num=10不是全局作用域吗,为什么函数内部不是使用

橘子好甜的主页 橘子好甜 | 菜鸟二级 | 园豆:206
提问于:2020-08-02 15:00
< >
分享
所有回答(7)
0

终于明白了!!
根据作用域链,console.log(num)输出的num会先查找function里面声明的var num;而此时num没有定义,所以返回的是undefied

橘子好甜 | 园豆:206 (菜鸟二级) | 2020-08-02 15:10
0

因为函数外部是全局作用域,函数内部是函数作用域,函数作用域内num变量提升,等于先声明,在console下面被赋值成20,console输出时先找自身作用域找到num输出,函数内部没有定义这个变量它才会去外面寻找,读取变量会优先在自身作用域中寻找

Genius丶Z | 园豆:235 (菜鸟二级) | 2020-08-03 11:46
0

var num=10;
fun(num);
function fun(num){
consonle.log(num);
var num=20;
}
这样就可以了,哈哈哈,答非所问

myzy | 园豆:123 (初学一级) | 2020-08-03 18:04
0

方法体是个独立的作用域,独立解析内部js代码,内部没有时,再往上找
console.log(num);
var num=20;
解析器先读取声明赋值undefined,再逐行执行

觉信 | 园豆:66 (初学一级) | 2020-08-08 10:51
0
var num=10;
fun();
function fun(){
  var num
  consonle.log(num);
   num=20;
}

你可以把程序看成上面的样子,fun函数内部先检索到了内部的num声明,在打印的时候num已经声明但是还未定义,所有打印出来是undefined

Lsever | 园豆:112 (初学一级) | 2020-10-14 11:39
0

很好奇,你写个consonle还能打印出来的?

龙井丶归 | 园豆:202 (菜鸟二级) | 2021-03-11 14:36
0

它的作用域链是这样的,代码执行前一刻会有一个预编译环节,预编译环节中先生成的全局作用域的GO{num :undefined,fun:undefined}然后是fun函数自己的AO{num:undefined}这是预编译环节产生的作用域链,再执行就从上到下,在fun函数内部,num= 20是在console.log之后的,所以当访问是访问到的是已经声明但并未赋值的num,所以结果是undefined

佛系小萌新 | 园豆:210 (菜鸟二级) | 2021-04-02 21:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册