一、ES6新增了let敕令
let 和 var 一样都是用来声明标量,但let所声明的变量只在【声明的代码块内】及【声明以后】有用
{
console.log(a); // undefined
console.log(b); // Uncaught ReferenceError: b is not defined(…)
var a = 5;
let b = 10;
}
console.log(a); // 5
console.log(b); // Uncaught ReferenceError: b is not defined(…)
let敕令适合在for轮回中运用
// i在for轮回内有用
for(let i = 0;i < 5;i++){
console.log(i); // 0 1 2 3 4
}
console.log(i); // Uncaught ReferenceError: i is not defined(…)
//i在全局内有用
for(var i = 0;i < 5;i++){
console.log(i); // 0 1 2 3 4
}
console.log(i); // 5
let 敕令临时性死区
// 大括号中的a运用了let声明,所以 a在大括号中临时只能在声明以后有用
var a = 5;
{
console.log(a); // Uncaught ReferenceError: a is not defined(…)
typeof a; // Uncaught ReferenceError: a is not defined(…)
let a =10;
console.log(a); // 10
}
console.log(a); // 5
let不允许在统一作用域内反复声明变量,因而不能在函数内从新声明变量
{
let a = 10;
var a = 15; //Uncaught SyntaxError: Identifier 'a' has already been declared
}
{
var a = 10;
var a = 15; // 不会报错
console.log(a); // 15
}
show(10);
function show(arg){
let arg = 5; //Uncaught SyntaxError: Identifier 'arg' has already been declared(…)
console.log(arg);
}
hide(10);
function hide(arg){
{
let arg = 5;
console.log(arg); // 5
}
console.log(arg); // 10
}
二、ES6新增了块级作用域
ES5只要全局作用域和函数作用域,会出现以下的题目
//1、内层变量覆蓋了外层变量
var number = 5;
show();
function show(){
console.log(number); // undefined
var number = 10 ;
}
//2、i泄漏成全局变量
var string = 'hello';
for(var i = 0 ;i<string.length ;i++){
console.log(string[i]); // h e l l o
}
console.log(i); // 5
ES6块级作用域写法(块级作用域能够无穷嵌套,能够替代ES5的匿名函数IIFE)
{
let number = 5;
console.log(number); // 5
{
let number = "hello";
console.log(number); // hello
}
}
ES5严厉形式下,函数不能在块级中声明,ES6明确规定能够在块级作用域中声明函数,但声明的函数有点相似let,在块级作用域以外不可援用,因为浏览器能够疏忽以上划定规矩,所以只管防止在块级作用域中声明函数。
//ES5非严厉形式
if(true){
function show(){ //不报错
};
}
//ES5严厉形式
'use strict';
if(true){
function show(){ //直接报错
};
}
//ES6严厉形式
'use strict';
if(true){
function show(){ //不报错
};
}
三、ES6新增了const敕令
const 声明的是一个只读的变量,一旦声明,不可变动,这就意味着一旦声明就必须初始化,不然会报错,const作用域和let作用域一样.
const PI; //Uncaught SyntaxError: Missing initializer in const declaration
const PI = 3.1415926;
console.log(PI); // 3.1415926;
PI = 4 ; // Uncaught TypeError: Assignment to constant variable.
//const声明的变量也和let一样,不能反复声明
var a = 1;
let b = 2;
const a = 5; //Uncaught SyntaxError: Identifier 'a' has already been declared
const b = 6 ; //Uncaught SyntaxError: Identifier 'b' has already been declared
//关于复合对象,变量名指向的是数据的地点,const声明的指向的是数据的地点稳定,但数据能够变;若要凝结数据,能够运用freeze.
const A = {};
A.props = 123;
console.log(A.props); // 123
A = {}; // Uncaught TypeError: Assignment to constant variable.
const B = Object.freeze({});
B.props = 456; // 通例形式,该行代码无效,严厉形式下会报错
console.log(B.props); // undefined
全局变量的属性
window.a = 1;
var a = 2 ;
console.log(a); // 2
console.log(window.a); // 2
window.b = 1;
let b = 2 ;
console.log(b); // 2
console.log(window.b); // 1
总结:
ES5 有两种声明变量的要领:var 和 function敕令
ES6 有六种声明变量的要领:var 、 function 、let 、const 、import、class敕令。