语言基础---变量

语言基础-变量

前言

从本篇博客开始 博主个人认为重要的知识点都会在在行前添加 ⭐ 来进行标识

创新互联建站专注于网站建设、成都网站制作、网页设计、网站制作、网站开发。公司秉持“客户至上,用心服务”的宗旨,从客户的利益和观点出发,让客户在网络营销中找到自己的驻足之地。尊重和关怀每一位客户,用严谨的态度对待客户,用专业的服务创造价值,成为客户值得信赖的朋友,为客户解除后顾之忧。

变量

ECMASCRIPT变量是松散类型,意思是变量可以用于保存任何类型的数据。ECMASCRIPT中有三个关键字可以来声明变量:var、let和const。

值得注意的是let和const只能在ES6以及更晚的版本中使用。

var关键字

定义变量的基本方式:

var message;//个人不推荐,在不初始化的情况下定义变量,就会保存一个特殊的值undefinded。

var car="奔驰";//ECMASCRIPT 实现变量初始化,此时就可以定义变量并设置它的初始值。

car=100;//合法,但是不推荐。

上面对于car变量的操作中,有一点值得注意,car变量首先被定义为一个字符串变量,后来又被赋值为数值。虽然这在ECMASCRIPT中完全合法,但是想想当项目庞大起来,一个能被随意赋值的变量会给项目增加多大的维护难度。这可能就是为啥现在TypeScript那么被青睐的原因之一。

var的作用域

⭐var是函数作用域,也就是说在函数内定义变量 在会在函数内部生效,并在函数退出时销毁该变量,这里就会涉及到js的垃圾回收机制。后面写到的再细说,示例代码如下:

function myfun(){
	var message='hello';
	//message=hello'; 合法,但不推荐,这样可以再局部作用域中定义全局变量。不推荐的原因也是因为不好维护,毕竟想想就很奇怪
}
myfun();
console.log(message);//报错

var声明提升

⭐使用var声明变量会把变量自动提升到函数作用域顶部

function foo(){
	console.log(name);
	var name='Mercy';	
}
foo();//undefined

之所以不会报错,是因为ECMASCRIPT把他等价于如下代码:

function foo(){
	var name;
	console.log(name);
	name='Mercy';	
}
foo();//undefined

let关键字

let作用域

⭐let跟var的作用差不多,但是有着非常重要的区别。最明显的区别就是,let声明的范围是块作用域,而var声明的范围是函数作用域。啥是块作用域通俗点讲就是 花括号 { } 包裹的代码块。

if(true){
   var name='Mercy';
   cosnole.log(name);//Mercy
}
cosnole.log(name);//Mercy
if(true){
   let name='Mercy';
   cosnole.log(name);//Mercy
}
cosnole.log(name);//ReferenceError:name 没有定义

冗余声明

⭐let也不允许同一个块作用域中出现冗余声明。

var name;
var name;

let age;
let age;//SyntaxError:标识符age已经声明过了

暂时性死区

⭐let与var的另一个重要的区别就是let声明的变量不会再作用域中被提升。

cosnole.log(age);
let age=22;//ReferenceError:age 没有定义

在let声明之前的执行瞬间被称为“暂时性死区”,在此阶段引用后面才声明的变量都会抛出ReferenceError。

全局声明

与var关键字不同,使用let在全局作用域中声明的变量不会成为为window对象的属性(var声明的变量则会)。

var name = 'Matt'; 
console.log(window.name); // 'Matt' 
let age = 26; 
console.log(window.age); // undefined

---持续更新中---


分享名称:语言基础---变量
标题来源:http://scyanting.com/article/dsojihe.html