JavaScript第七章学习

JavaScript第七章——函数表达式

定义方式

函数声明

JavaScript第七章学习_第1张图片

Firefox、Safari、Chrome 和 Opera都给函数定义了一个非标准的 name 属性,通过这个属性可以访问到给函数指定的名字

函数声明提升

在执行代码之前会先读取函数声明

意味着可以把函数声明放在调用它的语句后面

函数表达式

匿名函数(anonymous function)或拉姆达函数:匿名函数的 name 属性是空字符串(即没有函数名)

使用前必须进行赋值

递归函数

一个函数通过调用自身的情况下构成的

arguments.callee 是一个指向正在执行的函数的指针,在严格模式下,不能通过脚本访问 arguments.callee,访问这个属性会导致错误

闭包

指有权访问另一个 函数作用域中的变量的函数

创建闭包:一个函数内部创建另一个函数

闭包的作用链:匿名函数在引用活动对象时候,活动对象不会销毁,直到匿名函数被销毁后,这样才会被销毁

由于闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存。过 度使用闭包可能会导致内存占用过多

闭包与变量:闭包只能取得包含函数中任何变量的后一个值

关于this对象:匿名函数的执行环境具有全局性,因此其 this 对象通常指向 window

内存泄漏

闭包的作用域链中保存着一个 HTML元素,那么就意味着该元素将无法被销毁

不用的时候将变量设置为null,能够解除对DOM对象的引用,顺利地减少其引用数,确保正常回收其占用的内存

模仿块级作用域

在函数的活动对象中定义的变量,从定义开始,就可以在函数内部随处访问它

作块级作用域(通常称为私有作用域)的匿名函数的语法

定义了一个函数,然后立即调用了它的方式

函数表达式

JavaScript第七章学习_第2张图片

创建私有作用域:可以减少闭包占用的内存问题

私有变量

任何在函数中定义的变量,都可以认为是私有变量

私有变量包括函数的参数、局部变量和在函数内部定义的其他函数

有权访问私有变量和私有函数的公有方法称为特权方法(privileged method)

构造函数中定义特权方法

JavaScript第七章学习_第3张图片

必须使用构造函数模式来创建特权方法

静态私有变量

在私有作用域中定义私有变量或函数

JavaScript第七章学习_第4张图片

初始化未经声明的变量,总是会创建一个全局变量,例如上图中的MyObject 就成了一个全局变量

与在构造函数中定义特权方法的主要区别:就在于私有变量和函数是由实例共享的

不足之处:多查找作用域链中的一个层次,就会在一定程度上影响查找速度

模块模式

模块模式(module pattern)为单例创建私有变量和特权方法,单例(singleton),指的就是只有一个实例的对象

JavaScript第七章学习_第5张图片
JavaScript第七章学习_第6张图片

如果必须创建一个对象并以某些数据对其进行初始化,同时还要公开一些能够访问这些私有 数据的方法,那么就可以使用模块模式

增强的模块模式

该模式适合那些单例必须是某种类型的实例,同时还必须添加某些属性和(或)方法对其加以增强的情况

你可能感兴趣的:(JavaScript第七章学习)