let
基本用法
1.Let声明的变量仅在其代码块内有效。
{
let a=10;
var b=1;
}
console.log(b);
console.log(a);
2.for循环在设置循环变量的部分是一个父作用域,循环体内部又是一个独立的子作用域。
(两层作用域不会有影响,函数内部可声明自己的。)
for(let i=0;i<3;i++){
let i='abc’;
console.log(i);
}
变量提升
变量提升:var声明的变量无论其实际声明位置在何处,都会被是为声明于所在函数(或全局)的顶部。
function getValue(c){
if(c){
var value='blue';
return value;
}else{
return null;
}
}
上面代码会被JS引擎调整为:
function getValue(c){
var value;
if(c){
value='blue';
return value;
}else{
return null;
}
}
暂时性死区
在代码块内,使用let命令声明变量之前,该变量都是不可用的,这个区域被称为“暂时性死区”。
(let没有变量提升,必须先声明后使用。)
var temp=123;
if(true){
temp='abc';
let temp;
}
上面代码的区块中存在let命令,则这个区块对这些命令声明的变量从一开始就形成封闭作用域。
作用域
1.变量或函数在起作用的区域。
2.JavaScript采用的是“词法作用域”(静态作用域),即在变量作用域取决于变量所在的代码区域。
全局作用域
1.在所有函数之外定义的变量拥有全局作用域,该变量为全局变量。
2.全局变量可以在当前页面中任何JavaScript代码中访问。
3.var声明的变量会附着在window对象上,而let不会。
函数作用域
在函数中声明的变量(包括函数参数)指定在其所声明的函数内被访问。
块作用域
由{ }界定的代码区域,let声明的变量具备可访问块作用域。
IIFE:可以避免从块内部进行变量提升,允许公众访问方法,同时保留函数中定义的变量的私密性。
块级作用域的出现使得ES5中惯用的IIFE(立即执行匿名函数)不再必要了。
作用域链
每一段JavaScript代码(全局代码或函数)都有一个与之关联的作用域链(scope chain)。
当JavaScript查找变量x的时候( 变量解析,variable resolution),会从当前作用域开始跟随作用域链向上查找,直到找到x变量的声明,若到达全局作用域中仍未找到,则抛出一个引用错误(ReferenceError)异常。
const命令
基本用法
声明一个只读的常量,一旦声明,其值不能改变且必须立即初始化。
本质
当常量保存的不是一个原始值,而是一个地址的时候,该常量所引用的对象是可以更改成员的,只是不能更改该常量保存的地址。
只要后面不会更改的数据都用const声明。