JS全局变量和函数作用域变量区别

有这么一组题目看得我是目瞪口呆:

var var01 = 1;
function funtest() {
 document.write(var01);
 var var01 = 0;
} 
funtest();
//结果为:undefined
////////////////////////
var var01 = 1;
function funtest() {
 document.write(var01);
 var01 = 0;
} 
funtest();
//结果为:1
////////////////////////
 var01 = 1;
function funtest() {
 document.write(var01);
 var var01 = 0;
}
funtest();
//结果为:undefined
/////////////////////
var01 = 1;
function funtest() {
 document.write(var01);
 var01 = 0;
}
funtest();
//结果为:1

和我的理解不一样,求大佬解释一下

阅读 1.6k
2 个回答

你也没说你怎么理解的啊....
这些属于比较基础的知识,楼主可以先去看看书,比如js高程,自然就理解了。
两个概念:作用域链以及声明提升,这里以第一个例子为例:

var var01 = 1;
function funtest() {
 document.write(var01);
 var var01 = 0;
} 
funtest();

在创建funtest函数作用域的时候,var 声明的变量 var01提升到了该作用域顶部,声明和赋值是两个过程:
代码变成了:

var var01;
document.write(var01);
var01 = 1;

再讲作用域链,在读到var01这个变量的时候,沿着作用域链逐级向上回溯,在函数作用域中已经有了var01这个变量了,好了回溯停止不找了,在打印的时候,还没有进行赋值,所以undefined

var var01 = 1;
function funtest() {
 document.write(var01);
 var var01 = 0;
} 
funtest();
//结果为:undefined

作用域链从内向外查找,输出undefinde是因为函数变量声明提升,上面的代码等价于

function funtest() {
 var var01;
 document.write(var01);  // 这个时候打印,var01的值是undefinde
 var01= 0;
} 

2.

////////////////////////
var var01 = 1;
function funtest() {
 document.write(var01);
 var01 = 0;
} 
funtest();
//结果为:1

如过在函数内部声明的变量没有写var,这个变量会是一个全局变量,var01 = 0;相当于改变函数外面var01的值。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题