Rumah > Soal Jawab > teks badan
var a = 1;
var b = function(){
console.log(a); // function a(){}
a = 10;
console.log(a); //10
return;
function a(){} //声明提升
}
b();
console.log(a); //1 为什么是这个数?
最后打印出来的a值,不应该是10吗?为什么是1呢?
阿神2017-04-10 16:30:55
“函数声明同时也创建了一个和函数名相同的变量”
参考:MDN函数——Function构造函数vs函数声明vs函数表达式
所以,函数作用域中的代码执行顺序就相当于下面这样了:
var b = function(){
var a;//函数声明提升的同时创建了一个同名的变量
function a(){}
console.log(a);//函数声明覆盖变量声明,结果为function a(){}
a = 10;
console.log(a);//变量初始化覆盖函数声明,结果为10
return;
}
这表明在b函数作用域内又声明了一个变量a
,覆盖了全局变量a
,发生的一切都是在函数作用域内。
b函数外的console.log(a);
访问的自然是全局变量a
了,因为它访问不到b函数作用域内的变量。
关于变量声明提升VS函数声明提升,顺序谁在前谁在后参考变量声明提升VS函数声明提升
天蓬老师2017-04-10 16:30:55
我的理解,function a(){},相当于在局部作用域b函数中定义了一个a函数,a=10是对b作用域中的a赋值,此时局部作用域b中的a从函数变成一个常量。至始至终没有改变b外作用域中的a=1的值。
高洛峰2017-04-10 16:30:55
其实,你已知道声明提升,只是最后被代码搞乱了而已,把它整理成下面这样,就一目了然了,全局的变量a就没被改变过:
var a = 1;
var b = function(){
var a = function (){};
console.log(a);
a = 10;
console.log(a);
return;
//function a(){}
}
b();
console.log(a);
PHPz2017-04-10 16:30:55
声明有有两种,且仅有两种,var 以及 function ,所以调用了 b()就相当于在里面开了块动态内存,重新声明了个变量 a,这两个a 所处的内存位置都不一样,自然不是同一个了,b(){}里面的a,根本就不是外面的a,而且把b()调用执行了一次,那块内存就消失了。故尔,他们说外面的为全局变量,里面的就是局部变量,就是这个道理了!
PHP中文网2017-04-10 16:30:55
既然都理解了function a(){}
是函数的提前声明,怎么会不理解输出1呢,一开始在函数内部声明了一个局部变量a,由于执行上下文的特性缘故,执行函数时a变量就是一个函数了a=10
只是将你内部的局部变量更改了,也就是把你的那个function
改变为了'number'类型的变量,执行函数后,这个局部变量就会被销毁。
PHPz2017-04-10 16:30:55
var a = 1;
var b = function(){
console.log(a);
a = 10;
console.log(a);
return;
function a(){}
}
b();
console.log(a);
你也知道 b
函数里的 function a(){}
提升了,所以 b
函数里所有对 a
的操作其实都是重新赋值
这里说的 a
是局部的,是 b
函数内的
这里说的 a
是局部的,是 b
函数内的
这里说的 a
是局部的,是 b
函数内的
所以最后一句 console.log(a)
是打印全局的 a
,也就是一开始初始化的 1