js严格模式
‘use strict’
1.是否存在变量提升?
2.是否存在暂时性死区?
3.是否允许重复声明变量?
4.是否存在块级作用域?
5.是否能修改声明的变量?
1是否存在变量提升
变量提升:变量在声明之前可以使用,并且代码不报错 (预解释 预解析
1.用var声明的变量 存在变量提升
2.用let和const声明的变量 不存在变量提升
console.log(a);//undefined
var a = 10;
var fn = function (){};
fn();
function fn(){
}
console.log(a);
Cannot access ‘a’ before initialization
a初始化 之前不可以使用
let a = 10;
const a = 10;
2是否存在暂时性死区
是否存在暂时性死区
在用let声明一个变量之前 都不能使用这个变量,否则就会报错, 在这之前的代码块,对于这个变量来说都叫暂时性死区
1.用var声明的变量 不存在暂时性死区
2.用let和const声明的变量 存在暂时性死区
3是否允许重复声明变量?
1.用var声明的变量 允许重复声明
2.用let和const声明的变量 不允许重复声明
var a = 123;
var a = 456;
let b = [];
let b = {}; //Identifier ‘b’ has already been declared
b在声明之前已经被使用过了,不允许重复声明
console.log(a);{}
console.log(b);{}
4是否存在块级作用域?
作用域 全局作用域 局部作用域(函数作用域) 块级作用域
1.用var声明的变量 不存在块级作用域
2.用let和const声明的变量 存在块级作用域
var global = [];
function fn(){
var global = {};
}
console.log(global) //[]
{} //在ES6中一个{}就可以表示为一个块级作用域
ES5中
var global = 1;
if(global === 1){
var global = 2;
}
console.log(global)
let global = 1;
if(global === 1){
/console.log("global块级作用域",global)
let global = 2;
}
console.log("global全局作用域",global)
{
let temp = 1;
{
let temp = 1;
{
let temp = 1;
}
}
}
5.是否能修改声明的变量?
1.用var和let声明的变量 可以重复修改
2.用const声明的变量 不可以修改
var aa = “1234”;
aa = “123456”;
let aa = “1234”;
aa = “123456”;
const aa = “1234”;
aa = “123456”; //Assignment to constant variable.
使用const声明一个引用数据类型,只要不去修改内存地址,那么这个数据里面的内容是可以重复修改的
const obj = {
a: 10
};
obj.a = 100
obj = { a:100 }
const 使用场景
const Pi = 3.1415926;
const API = “http://www.baidu.com”;
const BaseUrl = “http://www.baidu.com”;
let aa;
const aa; //Missing initializer in const declaration
使用const声明变量,必须赋值