在JS代码中,对于变量的定义需要注意以下几点。
var
1、加var的变量在预编译期间会进行变量提升,没有加var的变量则不会进行变量提升。
2、不管是否加var,只要是全局变量,都会挂载到GO(window)上面。
3、加var的变量,可以做全局变量,也可以做局部变量。没有加var只能做全局变量。
注意:在项目中不要使用var,更不要使用没有加var的变量。
let
关于let,先来看一个例子。
console.log(a)
let a = 110
最后会报错: ReferenceError:Cannot access 'a' before initialization
上面报错的原因是因为a没有进行初始化(赋值),不能访问,所以会报错。
可以理解成:
let声明的变量是没有提升的,这一点和var不同。
同时,let+{}可以形成块级作用域。 如下例子:
if(true){
let c = 110
}
console.log(c)
此时的c是不能访问的,因为let形成了块级作用域.
变量只能在块中使用,出了这个块级作用域,则不能使用。
另外,使用let声明的变量,并不会挂载在GO上。
let a = 110
console.log(window.a) //undefined
并且,使用let定义变量名称不能重复。
let a = 1
let a = 2
console.log(a)// SyntaxError:Identifier 'a' has already been declared
所以下面的写法也是错的:
function fn(a){
let a = 110
}
同样会报相同的错误,因为在函数中,形参相当于函数内部定义的局部变量。
同时函数体中又使用let定义了a,let定义的变量名不能重复,所以会报错。
简单来说,一般在项目中都是用let来定义变量。
const
使用const来定义常量,一般具有以下特点。
1、使用const声明的变量不能修改。
const PI = 3.14
PI = 5 // TypeError:Assignment to constant variable
2、使用const声明变量时,必须赋值,不然也会报语法错误。
3、const声明的变量同let一样,不会进行变量提升。
4、const和{}也可以形成块级作用域。
5、const声明的变量也不会挂载到GO(window)上。
来做一些练习题。
console.log(fn) // undefined
window.fn() // 报错:window.fn is not a function。代码停止执行。
//此时如果注释掉上面的语句,代码会继续执行。
console.log(window.fn)
if("fn" in window){
//如果条件成立,首先会给fn进行赋值,代码就会依次执行。
fn()
function fn{
console.log('fn...')
}
}
fn() // fn...'注释掉报错语句后,会正常执行。
由于函数fn位于if代码块中,而在最新版本的浏览器中,
不会对函数进行整体提升,仅仅是提升fn函数名。