上面这段代码可能变量提升的原因,但是下面我的参数为什么又没被覆盖呢?
https://blog.csdn.net/qq_4369...
// b = 1是在函数提升和变量提升前执行的
function a (b) {
function b () {}
var b
console.log(b);
b = 10
console.log(b);
}
a(1)
// a=99是在函数提升和变量提升后执行的
function f1 () {
function a() {}
var a
a=99
console.log(a)
console.log(a)
a = 1
console.log(a)
}
f1()
首先形参b
可以理解为:
function a (var b) {
console.log(b);
var b = 10
function b () {
}
console.log(b);
}
也就是定义了b
代码就变成了:
function a () {
// 因为传入的是1
var b = 1
console.log(b);
var b = 10
function b () {
}
console.log(b);
}
就是重新定义了b并赋值为1, 这样结果就可以理解了:
函数a
内函数与变量提升, 此时b
是函数, 打印就是函数, 而后var b = 10
, b
就变成了10就打印了10
那是因为覆盖掉了, 不太建议这这上面纠结太多时间, 在开发时根本不能这样写会被骂
5 回答10.1k 阅读✓ 已解决
8 回答3.8k 阅读
9 回答2.6k 阅读✓ 已解决
14 回答3.8k 阅读
4 回答1.7k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
6 回答2k 阅读✓ 已解决
不要把时间浪费在这种毫无意义的问题上,你应该把时间花在这门语言能干些什么上
就以你的这个问题为例用
node --print-bytecode --print-bytecode-filter=a a.js
生成的字节码是这样的可以看到不管是函数b,还是重新的变量声明b都被当作了对a0寄存器的重新赋值(a0在这里表示为第一个参数寄存器),所以他的等价代码应该为
没人会写这种代码,相比这种毫无价值的问题,你更应该去了解,字节码是什么,什么是栈式虚拟机,什么是寄存器虚拟机,编译器是什么,闭包是怎么实现的
v8字节码解释
还有什么不懂可以问chatgpt