JS基本数据类型
数据类型
- 基础类型
- 字符串
- 数字
- null
- undefined
- symbol
- bigInt
- 布尔
- 对象 数组 函数等
作用域
变量的可访问性和可见性
静态作用域,通过它就能够预测代码在执行过程中如何查找标识符
全局作用域
在文件顶部声明
函数作用域
在函数内部声明
块级作用域
变量提升
JavaScript 只有声明的变量会提升,初始化的不会。
- var有变量提升
console.log(a);
var a = 3;
输出了 undefined,这是因为变量声明 (var a) 提升了,但是初始化(a = 3) 并不会提升,所以 a 变量是一个未定义的变量。 - let. const没有变量提升,提前访问会报错
- function函数可以先调用再定义
- 赋值给变量的函数无法提前调用
JS是怎么执行的
- 词法环境:基于ECMAScript代码的词法嵌套结构来定义标识符和具体变量和函数的关联。- 一个词法环境由环境记录器和一-个可能的引用外部词法环境的空值组成
- 变量环境:变量环境和词法环境的一-个不同就是前者被用来存储函数声明和变量(let 和const)绑定,而后者只用来存储var变量绑定
- Outer:指向外部变量环境的一个指针
this指向
JavaScript this 关键字 | 菜鸟教程 (runoob.com)
普通函数的this指向windows
- 在方法中,this 表示该方法所属的对象。
- 如果单独使用,this 表示全局对象。
- 在函数中,this 表示全局对象。
- 在函数中,在严格模式下,this 是未定义的(undefined)。
- 在事件中,this 表示接收事件的元素。
- 类似 call() 和 apply() bind()方法可以将 this 引用到任何对象。
小总结:在使用过程中尽量多使用箭头函数来解决this指向的困扰,函数中谁调用它this就指向谁
JavaScript 闭包
闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰。
直观的说就是形成一个不销毁的栈环境。
function A() {
var counter = 0;
function B() {
counter += 1
return counter;
}
return B
var a=A()