dfkjgklfdjg
2021-06-01 10:56:38 +08:00
我们在先在每次为 f 赋值之后输出以下 f 的值
```js
(() => {
{
function f() { 'A' }
console.log('f_1 =', f); // f_1 = ƒ f() { 'B' }
f = 1;
console.log('f_2 =', f); // f_2 = 1
f = 2;
console.log('f_3 =', f); // f_3 = 2
function f() { 'B' }
console.log('f_4 =', f); // f_4 = 2
f = 3;
console.log('f_5 =', f); // f_5 = 3
}
console.log('f_out =', f); // f_out = 2
})();
```
好了,那么有疑惑的点只会在 f_1 = ƒ f() { 'B' } 、f_4 = 2 和 f_out = 2 上对不对,其它的都是符合直觉的。
首先来看为什么 f_1 = ƒ f() { 'B' } 与 f_4 = 2
其实正确的书写方式应该是 1.声明函数; 2.声明变量; 3.业务逻辑;
所以简单改正之后其实类似这样
```js
(() => {
var f
{
f = function () { 'A' }
f = function () { 'B' }
console.log('f_1 =', f); // f_1 = ƒ f() { 'B' }
f = 1;
console.log('f_2 =', f); // f_2 = 1
f = 2;
console.log('f_3 =', f); // f_3 = 2
console.log('f_4 =', f); // f_4 = 2
f = 3;
console.log('f_5 =', f); // f_5 = 3
}
console.log('f_out =', f); // f_out = 2
})();
```
那么就剩下一个疑惑了,就是为什么 最后的 f_out = 2
明明之前已经输出了 f_5 = 3,这个我就不知道原理了,只能从 block scope 和 local scope 和你说
我把外部 local scope 中的 f 继续声明成 f , 而内部 block scope 中的 f 的声明成 _f:
```js
(() => {
var f
{
var _f
f = _f = function () { 'A' }
f = _f = function () { 'B' }
console.log('f_1 =', _f); // f_1 = ƒ f() { 'B' }
_f = 1;
console.log('f_2 =', _f); // f_2 = 1
_f = 2;
console.log('f_3 =', _f); // f_3 = 2
f = _f
console.log('f_4 =', _f); // f_4 = 2
_f = 3;
console.log('f_5 =', _f); // f_5 = 3
}
console.log('f_out =', f); // f_out = 2
})();
```
具体为什么可能需要大佬来解释了。