js. 进阶
作用域
规定了变量能够被访问的范围,离开了这个范围扁梁边不能被访问
局部作用域
- 函数作用域:在函数内部声明的变量只能在函数内部被访问,外部无法直接访问。
- 函数的参数也是函数内部的局部变量
- 不同函数内部声明的变量无法相互访问
- 函数执行完毕后,函数内部的变量实际被清空了
- 块作用域:再JavaScript中使用{}包裹的代码称为代码块,代码块内部声明的变量外部将有可能无法被访问
- let声明的变量会产生块作用域,var不会产生块作用域
- const声明的常量也会产生块作用域
- 不同代码块之间的变量无法相互访问
- 推荐使用let 或const
全局作用域
script标签 和.js文件的【最外层】就是全局作用域,在此声明的变量在函数内部也可以被访问全局作用域中声明的变量,任何其他作用域都可以被访问
作用域链
本质是底层的变量查找机制
- 在函数被执行时,会优先查找当前函数作用域中查找变量
- 如果当前作用于查找不到则会依次逐级查找父级作用域知道全局作用域
JS垃圾回收机制(Garbage Colletion)
内存的生命周期
- 内存分配
- 内存使用
- 内存回收
全局变量一般不回收(关闭页面回收)
一般情况下局部变量的值,不用了会被自动回收掉
内存泄漏:程序中分配的内存由于某种原因程序未释放或无法释放叫做内存泄漏
- 引用计数 跟踪记录被引用次数 次数是0 则释放内存
致命缺陷 :嵌套引用(循环引用)会导致内存泄漏 - 标记清除法: 将不再使用的对象定义为无法达到的对象。 从根部出发定时扫描内存中的对象。凡是能从根部到达的对对象,都是需要使用的。 无法由根部出发触及到的对象标记为不再使用,稍后回收。
闭包
概念:一个函数对周围状态的应用捆绑在一起,内层函数中访问到其外层函数的作用域
闭包=内层函数+外层函数的变量
作用:封闭数据,提供操作,外部也可以访问函数的变量
可能会引起内存泄漏
变量提升
只存在var
把所有var声明的变量提升到当前作用域的最前面,只提升声明,不提升赋值
函数进阶
函数提升
把所有函数声明的变量提升到当前作用域的最前面,只提升函数声明,不提升函数调用
函数参数
动态参数agruments
arguments是函数内部的内置的伪数组变量,它包含了调用函数时传入的所有实参
arguments 是伪数组只存在函数中、可以通过for循环依次得到传过来的实参
剩余参数
… 是语法符号,置于最末函数形参之前,用获取多余的实参 借助…获取剩余实参 是个真数组
开发中提倡多使用剩余参数
展开运算符
箭头函数
适用于需要匿名函数的地方
基本语法
const fn = () =>{}
只有一个形参可以省略小括号
const fn = x => {}
只有一行代码可以省略大括号
const fn =x => console.lot(x)
只有一行代码可以省略return
const fn = x=>x+x
箭头函数可以直接返回一个对象
const fn = (uname)=>({name:uname})
箭头函数参数
普通函数有arguments
箭头函数没有arguments动态参数,但是有剩余参数 …args
箭头函数this
箭头函数this 是上一次作用域的this 指向
箭头函数没有this
DOM事件回调函数不推荐使用箭头函数
解构赋值
数组解构
将数组的单元值快速批量赋值给一系列变量的简洁语法
加封号情况: 立即执行函数 、数组开头
对象解构
遍历数组 forEach(方法)
被遍历数组.forEach(function(当前数组元素,当前元素索引号))
** 筛选数组filter方法
构造函数
function Goods (name,price,count){
this.name=name
this.price = price
this.count=count}
const mi = new Goods(‘华为’,1999,20)
实例成员
实例对象上的属性和方法属于实例成员
内置构造函数
Object
Object.keys 静态
Object.assign()静态方法拷贝