JS之闭包(预编译=>执行期上下文=>作用域及作用域链=>闭包=>立即执行)

预编译:

生成全局及函数内部的执行期上下文

执行期上下文==>以函数为例:(全局执行期上下文(GO)的创建类似)

(1)在开始执行的前一刻,创建AO(activation object);

(2)将形参和声明的变量放入OA,值为undefined;

(3)将实参和形参统一;

(4)在函数体里找到函数声明,值赋予函数体。

(5)在执行相应赋值语句时,修改声明的变量。

需要注意:函数表达式,如“var test=function(){}”,不能视为函数声明。

作用域及作用域链:

(1)作用域的概念:每个函数都是一个对象(如何理解?),对象中有些属性可以访问,有些属性不能访问,由JavaScript引擎存取。[[scope]]就是其中一个,即作用域,内部存储了执行期上下文的集合。

(2)作用域链:由作用域的概念引出,因为作用域内部的执行期上下文是呈链式连接的,所以又称作作用域链。链的由上到下分布对应由内到外的执行期上下文。---------在函数被定义时,作用域链就饱含了上层的执行期上下文,在执行时将自己的执行期上下文加入作用域链。

闭包:

(1)外在表现:
在函数运行结束前,把其内部的函数体拿出,就形成了闭包。

(2)意义:
外部函数在执行结束后,其执行期上下文销毁,但是因为内部函数的作用域链包含了外部函数的执行期上下文,导致外部函数的执行期上下文随着内部函数的移出被保存了下来。

(3)栗子:

function test(){
    var count=1;
    function add(){
        count++;
        console.log(count);
    }
    return add();
}
var counter=test();
counter();
counter();
counter();
counter();
.
.
.

add()移出后保存了test的AO,因此每次执行后AO内的count值都会被修改。又因为是test
的AO,此时count只能由counter调用,全局无法访问。

立即执行:

(1)目的:针对初始化功能的函数,执行完立即释放。

(2)语法形式:表达式+执行符号。

(1) (function test(){})();
(2) (function text(){}());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值