1:作用域分类
全局作用域,函数作用域
2:作用域作用
隔离变量,不同的作用域下同名变量不会有冲突
3:作用域和上下文的区别
1:
全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义的时候就已经确定了,而不是在函数调用时。
全局执行上下文是在全局作用域确定之后,js代码马上执行之前创建。
函数执行上下文是在调用函数时,函数体代码执行之前创建
2:
全局作用域是静态的,只要函数定义好了就一直存在,且不会再变化
执行上下文是动态的,在调用函数的时候创建,函数调用完毕时上下文就会释放
4:联系
执行上下文是从属于所在的作用域的,
全局上下文==>全局作用域
函数上下文==>函数作用域
5:作用域链
1:多个上下级关系的作用域的链,它的方向是从上向下(从内到外)
查找变量就是沿着作用域链来查找的
2:查找一个变量的查找规则
在当前作用域下的执行上下文中查找对应的属性,如果有直接返回,否则进入2,在上级作用域的执行上下文中查找对应的属性,如果有直接返回,否则进入3,执行2的相同操作,直到全局作用域,如果还是找不到就会抛出找不到的异常。
6:全局作业域的面试题
输出10
第二个会报错,因为找不到
7:循环
8:如何产生闭包
当一个嵌套的内部函数(子)引入了嵌套的外部函数(父)的变量时,就会产生了闭包。
9:闭包的理解
1:是嵌套的内部函数
2:包含被引用变量的对象
10:产生闭包的条件
1:函数嵌套
2:内部函数引用了外部函数中的数据(变量|函数)
11:常见的闭包
调用几次外部函数就创建几次闭包。通过return 内部函数名,就将闭包暴露出去了。
12:闭包的作用
使用函数内部的变量在函数执行完后,仍然存活在内存中(延长了局部变量的生命周期)
让函数外部可以操作到函数内部的数据(变量|函数)
13:函数执行完后,函数内部声明的局部变量是否还存在?
一般是不存在,存在于闭包的变量才可能存在。
如果调用外部函数的时候赋值给一个变量时才会存在。
14:在函数外部能直接访问函数内部的局部变量吗?
不能,但是我们可以通过闭包让外部操作
15:闭包的声明周期
产生:在嵌套内部函数定义执行完成时就产生了(不是在调用)
死亡:在嵌套的内部函数成为垃圾对象时
16:闭包的应用
1:
2:
17:闭包的缺点
函数执行完后,函数内的局部变量没有释放,占用内存时间会变长
容易造成内存泄漏
18:解决办法
能不用闭包就不用
及时的释放
1:让内部函数成为垃圾对象–>回收闭包
19:内存溢出
一种程序运行出现的错误
当程序运行需要的内存超过剩余的内存时,就抛出内存溢出的错误
20:内存的泄漏
占有的内存没有及时的释放
内存泄漏积累多了就容易导致内存溢出
21:常见的内存泄露
意外的全局变量
没有及时清理的计时器或者回调函数
闭包
22:面试题目
这个用了闭包