javascript高级开发学习笔记六

来源:互联网 发布:人物合成软件 编辑:程序博客网 时间:2024/06/05 09:14

1.递归:使用arguments.callee代替函数名来实现。

2.闭包:有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。 闭包有点像匿名函数

               当某个函数第一次被创建时,会创建一个执行环境(execution context)及相应的作用域,并把作用域赋值给一个特殊的内部属性[[Scpoe]]。然后,使用this、arguments和其它定义的参数来初始化函数的活动对象。

               变量对象:每个执行环境都有一个表示变量的对象。全局环境的变量对象始终存在,局部环境的变量对象,则只在函数执行过程中存在。

               在创建函数时,会创建一个预先包含全局变量对象的作用域链,这个作用域链被保存在内部的[[Scope]]属性中。当调用该函数时,会为函数创建一个执行环境,然后通过复制函数的[[Scope]]属性中的对象构建起执行环境的作用域链。

               在一个函数内部定义的函数会包含外部函数的活动对象,外部函数的活动对象会添加到内部函数的作用域中。当外部函数执行完毕后,作用域链会被销毁,活动对象不会被销毁(仍然会留在内存中),因为匿名函数(内部函数)的作用域链仍然在引用这个活动对象。直到匿名函数销毁后,外部函数才会被销毁。


        2.1 闭包与变量:作用域链的这种配置引出了一个副作用,即闭包只能取得包含函数中任何变量的最后一个值。闭包所保存的是整个变量对象,而不是某个特殊的变量。

        2.2 this对象:在闭包中使用this会导致一些问题,this对象是在运行时基于函数的执行环境绑定的,在全局函数中,this相当于window,而当函数被做为某个对象的方法使用时,this等于那个对象。匿名函数的执行环境具有全局性,因此this对象通常指向window。

        2.3 内存泄露:如果闭包的作用域链中保存着一个HTML元素,那么就表示该元素将无法被销毁。

3.模仿块级作用域

       (function(){

                 //这里是块级作用域

       })();

       这种块级作用域定义方式是一个闭包

4.私有变量

        通过闭包实现特权方法,实现函数外部访问函数内部属性。

        静态私有变量、模块模式、增强的模块模式。 

0 0
原创粉丝点击