function 声明和变量声明有什么不同?

2019-06-21 22:04:44 +08:00
 lbfeng
var foo = 2;
console.log(foo); // 2

function foo() {

}
console.log(foo); // 2
var foo = 2;
console.log(foo); // 2

foo = function () {

}
console.log(foo); // function
function foo() {

}
console.log(foo); // function

var foo = 2;
console.log(foo); // 2

var foo可以覆盖function foo, 反之就不行。js 编译对这种操作是怎么解决的?感觉哪块知识有欠缺。

3392 次点击
所在节点    JavaScript
10 条回复
Orenoid
2019-06-21 22:21:02 +08:00
我记得 function 声明好像会提升到前面先解释,不是前端,说错勿喷。。
xlui
2019-06-21 22:31:41 +08:00
标识符优先级吧,楼下解释,我也不是前端
Yvette
2019-06-21 22:34:26 +08:00
楼上好像说反了,是 Variable Hoisting,变量的声明会提升到前面
faywong8888
2019-06-21 22:36:40 +08:00
一个是词法环境下的函数名,不可变(程序员代码运行时不可改变它);一个是普通的变量,可以随便玩
rabbbit
2019-06-21 22:52:00 +08:00
进入函数时分两步:
1 扫描函数内的所有函数和变量,将其绑定到作用域
2 执行函数代码

可以把作用域理解成一个对象, 要的时候就去这个对象里找.
对于步骤 1 也是有顺序的
先扫描函数,然后在扫描变量


所以实际运行代码是
1
```
function foo() {

}

foo = 2; // 这个其实 不会被提升, 因为有同名函数了
console.log(foo); // 2
console.log(foo); // 2
```
2
```
var foo;

foo = 2;
console.log(foo); // 2

foo = function () {

}
console.log(foo); // function
```
3
```
function foo() {

}
console.log(foo); // function

foo = 2;
console.log(foo); // 2
```
liuy1994g
2019-06-21 22:57:05 +08:00
就是变量声明提升,function 和 var 可以看作一样的东西
wolfie
2019-06-21 22:58:19 +08:00
非前端,第一次碰到时候真的是蒙逼。

[var 关于变量提升]( https://www.jianshu.com/p/184cb2075d16)
lbfeng
2019-06-21 23:23:07 +08:00
@rabbbit 正解。var foo 被忽略了。
Takamine
2019-06-22 11:19:31 +08:00
所以我用 let。:doge:
dartabe
2019-06-24 01:56:29 +08:00
函数声明和函数表达式的区别 函数声明是第一公民 提到最前面 函数表达式只是把变量声明提前 赋值还是在当前位置

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/576316

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX