let和var的区别

哎,跟你唠唠嗑哈,这事儿我得说说我十年前踩的坑。

记得1 4 、1 5 年那会儿,写前端特容易卡壳。
那时候谁用let啊,都是var。
你想想,写个循环,用var计数器,结果外面还能访问到,特烦。
有一次写个统计用户点击次数的函数,用var i,结果函数一完,外面还存着个i,最后统计结果都乱套了。
改了好久才明白是var这货的作用域太大了。

再说了,var变量提升这事儿,也挺闹心的。
你写代码,万一哪行不小心在声明前用变量了,var就给你提升了,啥事都没有,你都不知道。
我1 5 年在上海做项目,有个同事就是这坑里栽的,debug了半天才发现是变量提升惹的祸。

后来1 6 年左右,开始学let了。
块级作用域这玩意儿,用着确实顺手。
你写个if或者for里面用let声明个变量,外面就访问不到了,正好。
1 7 年在北京做另一个项目,写个组件,里面用let声明状态,结果组件外面就访问不到了,避免了好多全局污染的问题。

重复声明这事儿也一样。
用var,你可以在一个作用域里重复声明同一个变量,let就不行。
1 8 年在深圳做H5 ,有个地方不小心用let重复声明了,直接报错,还挺提示人。
用var的话,你都不知道自己是不是不小心覆盖了之前的声明。

总的来说啊,var和let这俩,let用着更安全,块级作用域这玩意儿现在也成了标配。
虽然var也能用,但尽量用let吧,尤其是块级作用域这事儿,省得以后调试的时候把自己绕进去。

hoisting和lifting有什么区别

结论: Hoisting:JavaScript中变量和函数声明被提升到作用域顶部,初始化值不提升。
Lifting:函数创建时词法环境确定并提升,包括局部和外部变量。
Hoisting关注声明位置,Lifting关注词法环境创建。
例子:
Hoisting:console.log(a); 输出 undefined,然后 a=1 0; 输出 1 0
Lifting:innerFunc(); 输出 1 0,即使 outerFunction 已执行完毕。