2018-4-25 seo达人
如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里
首先先介绍一下作用域等一些基础概念。
每个JavaScript函数都是一个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供JavaScript引擎存取,[[scope]]就是其中一个。
[[scope]] : 指的就是我们所说的作用域,其中存储了执行期上下文的集合
作用域链 : [[scope]] 中所存储的执行期上下文对象的集合,这个集合呈链式链接,我们把这种链接叫做作用域链。
运行期上下文 : 当函数执行时,会创建一个称为执行期上下文的内部对象(AO)。一个执行期上下文定义了一个函数执行的环境,函数每次执行时对应的执行环境都是的,所以多次调用一个函数会导致创建多个执行上下文,当函数执行完毕,它所产生的执行上下文被销毁。
查找变量 :从作用域链的顶端依次向下查找。
下面举一些例子:
之前学过函数的定义、函数表达式,还有一种函数叫做立即执行函数。
立即执行函数:函数执行过后立即被销毁。
立即执行函数的官方写法:
针对初始化功能的函数,可以有参数。
只有表达式才能被执行符号执行,能被执行符号执行的表达式,函数名字会被自动忽略。
下面是一道曾阿里面试题
下面是几道经典的例题,可以参考一下:
那么采用立即执行函数呢?会有怎样的结果呢?
闭包的现象:当内部函数保存到外部时会产生闭包。
闭包会导致原有的作用域链不释放,造成内存泄漏
(内存泄漏:内存占用(比如:手握沙子,握得越紧手里剩得就越少))
闭包触发的情况:
两个或多个函数互相嵌套,把里面的函数保存到外部,这样的情况一定会产生闭包。从外面还可以调用里面的函数。
闭包的作用:
实现公有变量
eg:函数累加器
可以做缓存(存储结构)
eg:eater
可以实现封装,属性私有化
eg:person()
模块化开发,防止污染全局变量
附加一个逗号操作符:
先看前面的表达式,再看后面的表达式,把后面表达式的计算结构返回
例题:
作用域
立即执行函数
大家可以自行思考一下。
闭包