函数作用域 函数内部
块级作用域 {}
不能
< script >标签内部
.js文件
能
JavaScript中的作用域是程序被执行时的底层机制,了解这一机制有助于规范代码书写习惯,避免因为作用域导致的语法错误
作用域链本质上是底层的变量查找机制
会优先查找当前函数作用域中查找变量
查找不到则会依次逐级查找父级作用域直到全局作用域
简称GC
js中内存的分配和回收都是自动完成的,内存在不使用的时候会被垃圾回收器自动回收
不再用到的内存,没有及时释放,就叫做内存泄漏
内存分配、内存使用、内存回收
全局变量一般不会回收;一般情况下局部变量的值,不用了,会被自动回收掉。
从根部扫描对象,能查找到的就是使用的,查找不到的就要回收
闭包=内层函数+外层变量
封闭数据,实现数据私有,外部也可以访问函数内部的变量
闭包很有用,因为它允许将函数与其所操作的某些数据(环境)关联起来
内存泄漏
var
先把var变量提升到当前作用域最前面
只提升变量声明,不提升变量赋值
然后依次执行代码
函数提升能够使函数的声明调用更灵活
函数表达式不存在提升的现象
函数提升出现在相同作用域中
arguments动态参数
伪数组
它只存在函数中
用于获取多余的实参
动态参数是伪数组
剩余参数是真数组
开发中使用剩余参数
可以把数组展开,可以利用求数组最大值以及合并数组等操作
展开运算符主要是数组展开
剩余参数在函数内部使用
箭头函数属于表达式函数,因此不存在函数提升
箭头函数只有一个参数时可以省略圆括号
箭头函数函数体只有一行代码时可以省略花括号{},并自动作为返回值被返回
加括号的函数体返回对象字面量表达式
没有
可以使用剩余参数
箭头函数不会创建自己的this,他只会从自己的作用域链的上一次沿用this
不推荐,特别是用到this的时候
时间回调函数使用箭头函数的时候,this为全局的window
是将数组的单元值快速批量赋值给一系列变量的简洁语法
立即执行函数
数组结构
undefined
剩余参数…获取剩余单元值,但只能置于最末位
构造函数是快速创建多个类似的对象
大写字母开头的函数
实例化
不续约
构造函数自动返回创建的新对象
实例对象的属性和方法即为实例成员
构造函数的属性和方法被称为静态成员
只能给构造函数使用的方法,比如Object.keys()
获取对象中所有属性(键)
获取对象中所有的属性(值)
forEach 遍历数组,不返回,用于不改变值,经常用于查找打印输出值
filter 过滤数组,筛选数组元素,并生产新的数字
map 迭代数组 返回新数组,新数组里面的元素是处理之后的值,经常用于处理数据
reduce 累计器 返回函数累计处理的结果,经常用于求和等
构造函数体现了面向对象的封装特性,构造函数实例创建的对象彼此独立,互不影响
构造函数
浪费内存
一个对象,我们也称为prototype为原型对象
共享方法,可以把那些不变的方法,直接定义在prototype对象上
实例化的对象
实例化的对象
指向该原型对象的构造函数
原型(原型对象)。构造函数都自动有原型。
prototype原型和对象原型__proto__里面都有
都指向创建实例对象/原型的构造函数
在实例对象里面
指向原型prototype
直接赋值的方法,只要是对象,都会相互影响,因为是直接拷贝对象栈里面的地址
浅拷贝如果是一层对象,不相互影响,如果出现多层对象拷贝还会相互影响。
拷贝对象之后,里面的属性值是简单数据类型直接拷贝值
如果属性值是引用数据类型则拷贝的是地址
自己利用递归函数书写深拷贝
利用js库里lodash里面的_.cloneDeep()
利用JSON字符串转换
throw抛出异常信息,程序会终止执行
throw后面跟的是错误提示信息
Error对象配合throw使用,能够设置更详细的错误信息
throw关键字
会终止程序
Error对象配合throw使用
try…catch用于捕获错误信息
将预估可能发生错误的代码写在try代码段中
如果try代码段中出现错误后,会执行catch代码段,并截获到错误信息
finally不管是否有错误,都会执行
try catch finally
写在try里面
利用catch的参数
谁调用指向谁
严格模式下指向undefined
向外层作用域中,一层一层查找this,直到有this的定义
构造函数,原型函数,字面量对象中函数,dom事件函数
需要使用上层this的地方
调用函数,并可以改变被调用函数里面的this指向
指定this,其余是实参,传递的参数整体做个了解,后期用的很少
都是调用函数,都能改变this指向
参数不一样,apply传递的必须是数组
相同点:都可以改变函数内部的this指向
区别点:call和apply会调用函数,并且改变函数内部的this指向,call和apply传递的参数不一样,call传递参数arg1,arg2这种形式,apply必须数组形式[arg]
bind不会调用函数,可以改变函数内部this指向
主要应用场景:
call调用函数并且可以传递参数‘
apply经常跟数组有关系,比如借助于数学对象实现数组最大值最小值
bind不调用函数,但是还想改变this指向,比如改变定时器内部的this指向
节流:就是指连续触发事件但是在n秒中只执行一次函数,比如可以利用节流实现1s之内只能触发一次鼠标移动事件
防抖:如果在n秒内又触发了事件,则会重新计算函数执行事件
节流:鼠标移动,页面尺寸发生变化,滚动条滚动等开销比较大的情况下
防抖:搜索框输入,设定每次输入完毕n秒后发送请求,如果期间还有输入,则重新计算时间