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 编译对这种操作是怎么解决的?感觉哪块知识有欠缺。
我记得 function 声明好像会提升到前面先解释,不是前端,说错勿喷。。
标识符优先级吧,楼下解释,我也不是前端
楼上好像说反了,是 Variable Hoisting,变量的声明会提升到前面
一个是词法环境下的函数名,不可变(程序员代码运行时不可改变它);一个是普通的变量,可以随便玩
进入函数时分两步:
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
```
就是变量声明提升,function 和 var 可以看作一样的东西
非前端,第一次碰到时候真的是蒙逼。
[var 关于变量提升]( https://www.jianshu.com/p/184cb2075d16)
正解。var foo 被忽略了。
所以我用 let。:doge:
函数声明和函数表达式的区别 函数声明是第一公民 提到最前面 函数表达式只是把变量声明提前 赋值还是在当前位置