JavaScript声明变量的三种方式

  • Post author:
  • Post category:java




JavaScript高级程序设计研读之声明变量的三种方式

预先需要掌握的知识点:



一、var关键字



1.var声明作用域

在函数内,使用var声明的变量为局部变量,并且只能在函数内调用(变量将在函数退出时被销毁)

function test () {
	var message = 'hello' // 局部变量
}
test()
console.log(message) // 报错



注意:

如果函数内没有使用var声明变量 则该变量变为在全局变量 可以在函数外部调用

*** 不推荐使用全局变量 原因如下:1.全局变量难以维护 2.严格模式下会报错 ***

function test () {
	message = 'hello' // 全局变量
}
test()
console.log(message) // hello



2. var声明提升

先来举个🌰:

function foo () {
	console.log(age)
	var age = 18
}
foo() // undefined


console.log(age)

在声明变量之前 调用函数没有报错 返回值为undefined 这种情况就叫变量提升 相当于以下代码

function foo () {
	var age
	console.log(age)
	age = 18
}
foo() // undefined

这就是所谓的变量提升



3.可重复声明一个变量



二、let关键字



1.let声明作用域

let和var的第一个区别是作用域不同 let声明的作用域为块作用域

举个🌰:

if (true) {
	var age = 18
	let name = 'cc'
}
console.log(age) // 18
console.log(name) // 报错:name未定义



注意:块作用域是函数作用域的子集



2.let声明不允许冗余声明

举个🌰:

var name 
var name 
let age
let age // 报错

换言之:一个变量名只允许声明一次



3.暂时性死区

let和var的第二个区别就是 let不会进行变量提升 而var会进行变量提升

// name 会被提升
console.log(name) // undefined
var name = 'cc'

// age不会被提升
console.log(age) // 报错
let age = 18

在let声明之前的执行瞬间被称为

暂时性死区



4.全局声明

let在全局作用域下声明的变量不会变成window对象的属性(var会)

举个🌰:

var name = 'cc'
console.log(window.name) // cc

let age = 19
console.log(window.age) // undefined

但是 let声明仍在全局作用域中发生 相应变量会在页面生命周期内存续 所以let不能重复声明变量



5.for循环中的let声明

let声明和for循环配一脸 可以解决我们之前迭代的变量的奇特声明和修改

举个🌰:

for (var i=0, i<5,i++){	console.log(i)}// 5 5 5 5 5

之所以会这样是因为在退出循环时 迭代变量保存的是导致退出循环的值:5

但是 使用let声明迭代变量时 每次都会生成一个新的迭代变量 所以打印出来的迭代变量的值也跟之前有所区别

for (let i=0,i<5,i++) {	console.log(i)}// 0,1,2,3,4



三、const关键字

const 声明变量和let的相同点:1.作用域在块作用域下 2.不允许重复声明变量



1.const声明



1.使用const声明变量时 必须要初始化变量否则会报错

const age  // 报错const age = 26



2.尝试修改const声明的变量会导致运行时错误

const name = 'cc'name = 'gg' // 报错



3.const声明的限制适用于指向的变量的引用

换言之:如果变量引用的是一个对象的话 那么修改对象内部的属性并不违反const的限制

举个🌰:

const obj = {	name: 'cc',	age: 18}obj.age =19 // 不会报错



4.不能用const来声明迭代对象

原因:迭代对象会自增(自减) const不允许被修改



注意:const可以声明不会被修改的for循环变量 每次迭代都是生成一个新的变量 (for-in) (for-of)较为适合

新手上路 如有不对 请各位大佬多多指正



版权声明:本文为weixin_42454971原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。