js中的变量以及作用域

本博客参考:
1.菜鸟教程 - 学的不仅是技术,更是梦想!(关于关键字let和const)
2. 四菜一汤~的博客(关于JavaScript中变量的声明)
3. 顺其自然~的博客(关于js中变量的命名规则)
4. 菜鸟教程 - 学的不仅是技术,更是梦想!(关于JavaScript 声明提升)
5. Netwrok_Nova的博客(JavaScript中的let是什么)
6. 《HTML5+CSS3+JavaScript网页设计案例课堂(第2版)》(关于变量)

变量

用于存储信息的单元,对应于某一个内存单元

命名规则

创建变量名称时,应该遵守以下规则

  1. 首字符:字母、下划线、$符号,不能是文字或数字
  2. 后续字符:字母、下划线、$符号和数字
  3. 不能是js的保留字或关键字
  4. 注意区分大小写
  5. 建议驼峰式命名法

变量声明

声明一个变量,就是使用关键字对一个变量进行命名
声明格式

//只声明单个变量
var 变量名;
// 声明一个变量并对其命名
var 变量名="值";

// 同时声明多个变量
var 变量名1,变量名2,...;
// 同时声明多个变量并赋值
var 变量名1="值1",
	变量名2="值2",
	...;

关于关键字var声明变量的一些问题

  1. 在函数外声明的变量作用域是全局的,但如果在函数内未使用var关键字对变量进行声明,定义的变量也将成为全局变量(非严格模式下)。
function test1(){
	ss="这是一个全局变量";
	return ss;
}
console.log(ss);
//输出 “这是一个全局变量”

虽然js是一种弱类型的程序设计语言,变量可不声明直接使用,但是大量的全局变量使得程序的可维护性变得很低

  1. 声明提升
    js中所谓的声明提升,就是函数及变量的声明都将被提升到函数的最顶部,但是变量的初始化赋值不会提升,如果先使用变量然后对变量进行声明和初始化赋值,那么使用到的变量值将会是一个undefined值
function test1(){
	console.log(ss);//输出:undefined
	var ss=9;
}
  1. for 循环的变量溢出
    js中将{}称为一个块,在for循环中我们常常需要指定一个变量用于循环的控制,一般来说,循环结束这个变量就应该没用了(我们称该变量的作用域为for循环块内),但是使用var声明的变量会在循环结束后继续停留在程序中,后续程序依然能够使用该变量,这样常常会造成一些问题
for(var ss=0;ss<11;ss++){
 	;// 此处表示空语句
}
console.log(ss);
//此处将会输出 11

上面的问题其实并不大,而且很容易解决,我们只需要每个作用域开始前声明这些变量即可,这也是正常的 JavaScript 解析步骤,易于我们理解。

let和const关键字的引入

ES6引入了一种新的作用域–块作用域

let关键字

其中使用let关键字声明的变量只在某一代码块中有效,有效解决了上面使用var关键字声明变量造成的许多问题

  1. 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
  1. let关键字定义的变量不允许先使用,需要先声明再使用(不存在变量提升)
console.log(ss);// 报错:Uncaught ReferenceError: ss is not defined
let ss=1;

除此之外,使用let关键字还具有以下特点

  1. 声明的全局作用域变量不属于 window 对象
let carName = "奥迪";
// 不能使用 window.carName 访问变量
  1. 不允许在同一作用重复声明同一变量
let ss=1;
let ss;	// 报错:Uncaught SyntaxError: Identifier 'ss' has already been declared

const关键字

使用格式

const 常量名=;

使用const关键字的注意事项

  1. const关键字常用于定义常量
  2. const声明的常量必须初始化赋值,声明后不允许再次声明和赋值,否则会报错:“Uncaught SyntaxError: Identifier ‘cars’ has already been ”
  3. 使用const定义的如果是普通常量,那么定义后不允许再次修改其值,否则会报错:“Uncaught TypeError: Assignment to constant variable”;如果定义的的是数组或对象,可进行修改
// 定义一个数组
const arr1=[1,2,3];
//修改数组的第二个元素
arr1[1]=99;
//定义一个对象
const person = {name:"小明",age:"12"};
//对对象的属性进行修改
person.age="13";
  1. const声明的常量也具有块级作用域
  2. 常量名不能与作用域内的其他变量名或函数名相同

关于作用域

变量的作用域,就是可以访问该变量的代码区域
在 ES6 之前,JavaScript 只有两种变量(两种作用域): 全局变量 与 函数内的局部变量。

全局变量

具有全局作用域,网页中所有脚本和函数均可使用

局部变量

具有局部作用域,只作用于函数内,所以不同的函数可以使用相同名称的变量。在函数开始执行时创建,函数执行完后局部变量会自动销毁。

块作用域

Es6增加了另一种作用域:块级作用域,它规定每一个{}为一个“块”(如定义函数使用的大括号、for所使用的的大括号等等),使用let、const声明变量\常量时,这些标识符的作用域仅仅在该大括号内

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夺笋123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值