一看就懂的var、let、const三者区别

哎呀,我真的遇到麻烦了。
我记得几年前,我刚刚接手一个老项目,代码很糟糕。
到处都有变量。
如果你仔细想想,变量是在循环内部声明的,但它们也在循环外部使用,使得后续的更改变得一团糟。
有好几次,我在半夜梦见改变数量的范围。

无论是let还是const,块级作用域都是救星。
想一想,在前面的循环中,使用了var。
循环结束后,外面的i还在变化。
结果,其背后的逻辑完全混乱了。
然后,我把一切都改成了让。
现在好多了。
我在块中声明它并在块中使用它。
完成了,干净多了。

还有const,刚开始使用的时候我也很困惑。
我以为声明为const的变量根本不能移动,但后来我发现对象中的属性仍然可以改变。
例如 const obj = {name: '老王'};对象年龄 = 3 0;这真是太好了。
但如果用obj = {name: '老李'}的话,那就不行了,会报错。
这个细节我实在是想不通。

所以,现在写代码的时候,如果可以的话就不需要var。
为了非常有用,块级作用域非常简单。
const 用于定义保持不变的值或对象,但请记住,对象中的内容是可以更改的。
哎,说到写代码,年纪越大,越意识到细节决定成败。

js 变量声明易混淆的几点知识

我记得有一天在一家咖啡馆里,坐在我旁边的那个人正在写代码。
他突然皱起眉头说道:“这个JavaScript怎么这么奇怪?”他写了类似 console.log(foo); 的东西。
在屏幕上,但输入的不是变量值,而是函数名称。
我过去一看,原来他不明白变量和函数名递增的优先级。

看这行代码 var foo = "variable";事实上它已经被提升为 var foo;在函数声明之前,但这不会覆盖函数声明。
就像在壁橱里挂衣服一样,函数声明首先被挂起,无论稍后是否有对同名变量的赋值。
所以console.log(foo);首先找到函数 foo,然后找到 when foo = "variable";稍后执行时,只会覆盖函数,而不是变量覆盖函数。

最搞笑的是顺序赋值num1 = num4 = 2 ;,其中num4 不会被提升,并且会立即报错“num4 is not Define”。
就等于说:“先给我两块钱,然后给我四块钱。
”你只给了我两块钱,你哪来的四块钱?但是,此问题在 Chrome 和 IE 中的表现可能有所不同。
Firefox 更加严格,甚至不提前声明块级函数。

昨天看了一个老项目,其中if语句中有一个嵌套函数语句。
结果Chrome和IE都把最里面的函数当成了全局的,而Firefox却正常报错。
这让我想知道那些使用旧浏览器编写代码的人是否有自己的“函数覆盖”错误。

但同时,函数的作用域是在写代码的时候就确定的,还是比较靠谱的。
就像你租的房子的地址不会因为你搬家而改变,但租客会随时改变。
因此 foo() 总是在定义时返回范围内的 x。
即使你调用它三次,你仍然会访问同一个 x 对象。

等等,还有一件事,我突然想到,为什么函数体内的x.a++可以改变对象x的属性呢?由于该函数返回对象的引用,因此同一对象被修改。
这就像借了朋友的雨伞,而你的朋友来修理它。
当他回到家时。
下次借同一把雨伞时,它仍然会有划痕。

这时候,咖啡小哥又敲了一遍代码,说道:“在这个闭包里改变外部变量,真奇怪。
”你看,z()连续调用了3 次,输出是{a: 4 },这意味着每次调用x.a++都是对同一个对象进行操作。
就像在游乐园租碰碰车一样。
如果按三下加速按钮,碰碰车将保持不变,但速度会增加三倍。

现在我想一下:如果我把这里的x改成基类型var x = "abc";,结果会怎样呢?连续赋值会变成字符串连接吗?你必须回去尝试一下才能找到答案。