1、变量声明方式: var 、function 、let 、const 、class、import
2、let、const声明的变量只在它们所在的代码块中有效,形成“暂时性死区”(temporal dead zone: TDZ)
3、let命令用于for循环中,依靠JavaScript引擎才能记住每次循环的let变量
4、只有var声明的变量会存在变量提升,let和const不会
5、let、const不可以重复声明一个变量,会报错
6、ES5只用全局作用域和函数作用域,ES6增加了块级作用域
7、块级作用域(必须要有大括号,否则JavaScript不认为是块级作用域)的出现,使得广泛使用的匿名立即执行函数表达式不再有必要了
// 匿名立即执行函数表达式 IIFE
( function(){
let a=2
}() )
// 可以直接使用块级作用域代替
{
let a=2
}
8、ES5中函数只能在顶层作用域和函数作用域中声明,不能在块级作用域中声明;ES6中函数可以在块级作用域进行声明
if(true){ //ES5中 是非法的
function aaa(){}
}
if(true){ //ES6中 合法的
function aaa(){}
}
9、严格模式下,函数声明只能在当前作用域的顶层
// 不报错
'use strict';
if (true) {
function f() {}
}
// 报错
'use strict';
if (true)
function f() {}
10、const命令只读,一旦声明赋值便不可改变,本质上不是变量的值不可改变,而是变量指向的内存地址中所保存的数据不能改变,但要注意引用类型和基础类型数据的区别
const a = 111
a = 222 //报错
const arr = []
arr[0] = 11 //正确
arr = ['1111'] //报错
const obj = {}
obj.name = 'bob' //正确
obj = {age: 111} //报错
cost obj = Object.freeze({}) //彻底冻结引用类型的数据
obj.name = 'bob' //报错
11、var声明的变量是顶层对象的属性,let、const、class声明的全局变量不是顶层对象的属性
12、浏览器环境下的顶层对象是window,node环境下的顶层对象是 global,web worker中的顶层对象是 self,ES2020的顶层对象设置为globalThis
// 获取顶层对象---方式1:
var getGlobal = function(){
if(typeof self !== 'undefined') return self
if(typeof window !== 'undefined') return window
if(typeof global !== 'undefined') return global
throw new Error('没有找到顶层对象')
}
// 获取顶层对象---方式2:
(typeof window !== 'undefined'? window : (typeof process === 'object' && typeof require=== 'function' && typeof global === 'object') ? global : this);
就记录到这里,祝大家开心