【理解var、let、const】

38 阅读2分钟

在JS代码中,对于变量的定义需要注意以下几点。

var

1、加var的变量在预编译期间会进行变量提升,没有加var的变量则不会进行变量提升。
2、不管是否加var,只要是全局变量,都会挂载到GOwindow)上面。
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声明变量时,必须赋值,不然也会报语法错误。
3const声明的变量同let一样,不会进行变量提升。
4const和{}也可以形成块级作用域。
5const声明的变量也不会挂载到GOwindow)上。

来做一些练习题。

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函数名。