本博客参考:
1.菜鸟教程 - 学的不仅是技术,更是梦想!(关于关键字let和const)
2. 四菜一汤~的博客(关于JavaScript中变量的声明)
3. 顺其自然~的博客(关于js中变量的命名规则)
4. 菜鸟教程 - 学的不仅是技术,更是梦想!(关于JavaScript 声明提升)
5. Netwrok_Nova的博客(JavaScript中的let是什么)
6. 《HTML5+CSS3+JavaScript网页设计案例课堂(第2版)》(关于变量)
变量
用于存储信息的单元,对应于某一个内存单元
命名规则
创建变量名称时,应该遵守以下规则
- 首字符:字母、下划线、$符号,不能是文字或数字
- 后续字符:字母、下划线、$符号和数字
- 不能是js的保留字或关键字
- 注意区分大小写
- 建议驼峰式命名法
变量声明
声明一个变量,就是使用关键字对一个变量进行命名
声明格式
//只声明单个变量
var 变量名;
// 声明一个变量并对其命名
var 变量名="值";
// 同时声明多个变量
var 变量名1,变量名2,...;
// 同时声明多个变量并赋值
var 变量名1="值1",
变量名2="值2",
...;
关于关键字var声明变量的一些问题
- 在函数外声明的变量作用域是全局的,但如果在函数内未使用var关键字对变量进行声明,定义的变量也将成为全局变量(非严格模式下)。
function test1(){
ss="这是一个全局变量";
return ss;
}
console.log(ss);
//输出 “这是一个全局变量”
虽然js是一种弱类型的程序设计语言,变量可不声明直接使用,但是大量的全局变量使得程序的可维护性变得很低
- 声明提升
js中所谓的声明提升,就是函数及变量的声明都将被提升到函数的最顶部,但是变量的初始化赋值不会提升,如果先使用变量然后对变量进行声明和初始化赋值,那么使用到的变量值将会是一个undefined值
function test1(){
console.log(ss);//输出:undefined
var ss=9;
}
- for 循环的变量溢出
js中将{}称为一个块,在for循环中我们常常需要指定一个变量用于循环的控制,一般来说,循环结束这个变量就应该没用了(我们称该变量的作用域为for循环块内),但是使用var声明的变量会在循环结束后继续停留在程序中,后续程序依然能够使用该变量,这样常常会造成一些问题
for(var ss=0;ss<11;ss++){
;// 此处表示空语句
}
console.log(ss);
//此处将会输出 11
上面的问题其实并不大,而且很容易解决,我们只需要每个作用域开始前声明这些变量即可,这也是正常的 JavaScript 解析步骤,易于我们理解。
let和const关键字的引入
ES6引入了一种新的作用域–块作用域
let关键字
其中使用let关键字声明的变量只在某一代码块中有效,有效解决了上面使用var关键字声明变量造成的许多问题
- let关键字定义的变量的作用域固定,不存在作用域溢出的问题。同一个变量名可以在不同的作用域中使用let关键字重新声明赋值
let ss=1;
console.log(ss);// 输出1
{let ss=2;
console.log(ss);//输出2
}
function test1(){
for(var ss=0;ss<11;ss++){;}
console.log(ss);
}
test1();// 输出11
- let关键字定义的变量不允许先使用,需要先声明再使用(不存在变量提升)
console.log(ss);// 报错:Uncaught ReferenceError: ss is not defined
let ss=1;
除此之外,使用let关键字还具有以下特点
- 声明的全局作用域变量不属于 window 对象
let carName = "奥迪";
// 不能使用 window.carName 访问变量
- 不允许在同一作用重复声明同一变量
let ss=1;
let ss; // 报错:Uncaught SyntaxError: Identifier 'ss' has already been declared
const关键字
使用格式
const 常量名=值;
使用const关键字的注意事项
- const关键字常用于定义常量
- const声明的常量必须初始化赋值,声明后不允许再次声明和赋值,否则会报错:“Uncaught SyntaxError: Identifier ‘cars’ has already been ”
- 使用const定义的如果是普通常量,那么定义后不允许再次修改其值,否则会报错:“Uncaught TypeError: Assignment to constant variable”;如果定义的的是数组或对象,可进行修改
// 定义一个数组
const arr1=[1,2,3];
//修改数组的第二个元素
arr1[1]=99;
//定义一个对象
const person = {name:"小明",age:"12"};
//对对象的属性进行修改
person.age="13";
- const声明的常量也具有块级作用域
- 常量名不能与作用域内的其他变量名或函数名相同
关于作用域
变量的作用域,就是可以访问该变量的代码区域
在 ES6 之前,JavaScript 只有两种变量(两种作用域): 全局变量 与 函数内的局部变量。
全局变量
具有全局作用域,网页中所有脚本和函数均可使用
局部变量
具有局部作用域,只作用于函数内,所以不同的函数可以使用相同名称的变量。在函数开始执行时创建,函数执行完后局部变量会自动销毁。
块作用域
Es6增加了另一种作用域:块级作用域,它规定每一个{}为一个“块”(如定义函数使用的大括号、for所使用的的大括号等等),使用let、const声明变量\常量时,这些标识符的作用域仅仅在该大括号内