还记得一开始做项目的前端时,HTML,CSS,JavaScript都没有怎么接触过,看着动不动几百行甚至上千行的页面,很是头痛,只能一点一点看,什么不知道怎么调用接口,怎么简单处理后端返回的数据,连JSON都不知道是啥,做多了之后,渐渐明白JS才是真正的核心,vue原来是一个JS库,慢慢感觉到了JS的强大,真的忍不住说一句:“Java是世界上最好的语言”
JS的变量提升(hoisting)
顾名思义,就是把变量和函数的声明都提升到顶部,看栗子看栗子(我书写JavaScript的习惯是不加分号,但有的时候分号是必须的,缺少分号,可能会出现意想不到的错误)
以下两个demo的运行结果相同:
x = 5 //初始化
console.log("x: ", x)
var x //声明
var x
x = 5
console.log("x: ", x)
在控制台输出的结果均为:x: 5
现在我们可以理解何为变量提升,第一个例子中,我们在最后声明变量x,却可以在一开始就使用它。但如果你没有开启“严格模式”(下篇会整理这个),即使不声明变量(var x),它也是可以使用的,而且会成为全局变量,但当你在函数内直接使用而不定义变量时,这是非常糟糕的,这污染了全局的命名空间
JS的初始化不会提升
"use strict"; //严格模式
var x = 1
var y = 4
console.log("x + y: ", x+y)
运行结果:
x + y: 5
"use strict"; //严格模式
var x = 1
console.log("x + y: ", x+y)
console.log("x: ", x)
console.log("y: ", y)
var y = 4
运行结果:
x + y: NaN
x: 1
y: undefined
变量y的声明提升了,可是y=4显然没有,例二等同于
"use strict";
var x = 1
var y
console.log("x + y: ", x+y)
console.log("x: ", x)
console.log("y: ", y)
y = 4