美文网首页
第7章 函数表达式

第7章 函数表达式

作者: 94小辉 | 来源:发表于2017-05-20 21:02 被阅读0次

    1、定义函数的两种方式:
    1)函数声明:存在函数声明提升
    2)函数表达式:使用前必须先赋值;匿名函数(拉姆达函数)

    2、关于递归:
    arguments.callee()指向正在执行的函数的指针(严格模式下会报错,严格模式下改用函数表达式)

    3、闭包:有权访问另一个函数作用域中的变量的函数
    创建闭包的常见方式:在一个函数中创建另一个函数

    来更通俗地理解一下:
    我们用“变量对象”这个名词来表示执行环境
    全局变量的“变量对象”一直存在
    函数的“变量对象”只有在执行的时候才存在

    创建函数的时候,会创建包含全局“变量对象”的作用域链
    调用函数的时候,有了执行环境,作用域链就加上了该函数的“变量对象”

    作用域链的组成:
    arguments和其他命名参数的值初始化的活动对象------>
    外部函数的活动对象------>
    外部函数的外部函数的活动对象------>
    ..........------>
    全局执行环境

    作用域本质上是:指向变量对象的指针列表

    外部函数执行完以后,作用域链就会被销毁,但是直到包含的匿名函数销毁后,他的活动对象才会被销毁。

    由于闭包携带包含它的函数的作用域,占用内存更多,因此应该慎重考虑使用它。

    4、匿名函数的执行环境具有全局性,因此this总是指向window
    解决办法:在创建闭包,也就是匿名函数之前,就把this的值转移赋值给另一个变量(例如that)

    5、比较重要的一点:匿名函数之模仿块级作用域(私有作用域)
    (function () {}) ();
    避免向全局作用域中添加过多的变量和函数,团队合作中很容易导致命名冲突。

    6、私有变量包括函数的参数、局部变量、函数内部定义的其他函数
    可以利用闭包来创建私有变量的共有方法(特权方法)
    1)利用构造函数,缺点是对于每一个新实例都要创建一组同样的方法组
    2)静态私有变量:利用了块级作用域和原型模式,达到了方法复用,但是实例们没有属于自己的私有变量
    *sp1)为单例创建特权方法:返回对象(特权方法在这)的匿名函数。
    补充一下:js通过对象字面量来创建单例,单例通常都是作为全局对象存在的。
    *sp2)适合特定类型----增强的模块模式:先new再返回一个对象(带有公共属性和特权方法)

    相关文章

      网友评论

          本文标题:第7章 函数表达式

          本文链接:https://www.haomeiwen.com/subject/dzkpxxtx.html