javascript预解析变量函数声明提升问题

来看一个有趣的例子:

var fish = 1;
function bear(){
   fish = 2;
   return;
   function fish(){};
}
bear();
console.log(fish);
这里运行的结果是1。

可能会有人疑惑为什么是1不是2呢(^-^),这也是我最开始疑惑的。

我们可以试试如果在fish=2这行代码之后加上console.log(fish)会怎么样:

var fish = 1;
function bear(){
   fish = 2;
   console.log(fish);
   return;
   function fish(){};
}
bear();
得到的结果为2。

也就是说在bear()函数返回之前fish的值为2,函数返回之后fish的值就变为1了,那么这中间发生了什么呢?

其实,javascript预解析的时候会发生变量和函数的声明提升,字面上讲就是在当前作用域下将变量和函数的声明提到最前面,事实上,变量和函数的声明在代码中的位置并不会发生改变,而是在编译阶段被放入内存中。

为了理解,现在我们先把全局作用域下的函数和变量声明提升:

var fish;
function bear(){
   fish = 2;
   return;
   function fish(){};
}
fish = 1;
bear();
console.log(fish);
然后把bear()函数中的fish函数声明提升:

var fish;
function bear(){
   function fish(){};
   fish = 2;
   return;
}
fish = 1;
bear();
console.log(fish);
现在答案已经清晰了,因为在最后一行的console.log(fish)中的fish是指的全局作用域中的变量fish,而bear函数中的fish其实是指在bear函数局部作用域中fish函数,即使将其赋值为2也与全局作用域中的fish无关了。

---更多文章请进入我的个人网站浏览交流学习http://coocochen.com


————————————————
版权声明:本文为CSDN博主「coocochen」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36368991/article/details/90743239

发布了224 篇原创文章 · 获赞 74 · 访问量 40万+

猜你喜欢

转载自blog.csdn.net/qq_34629352/article/details/104101666