关于函数表达式(作者私人仓库)

365 阅读3分钟

一、首先,定义 函数有两种方式

一种是函数声明,一种是函数表达式。

1、函数声明

语法:

它的一个重要特征就是 函数声明提升。

如图,由于变量提升,这个语句会引发意想不到的错误。

2、函数表达式

3、一点在运用匿名函数的时候的小提示

二、递归

1、

arguments.callee 是一个指向正在执行的函数的指针 2、

避免arguments。callee在严格模式下不能执行的问题

三、闭包

1、

2、闭包与变量(这个比较重要) 2.1

每个函数都引用着保存变量i的同一个变量对象,所以在每个函数内部i的值都是10.

2.2

在匿名函数内部,又创建并返回了一个访问num的闭包,这样一来,rresult数组中的m每个函数都有z自己num变量的一个副本,因此就可以返回各自不同的数值了。

四、关于this

1、

2、 来看一个例子

每个函数在调用时都会自动取得两个特殊变量:this和arguments。

内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。

解决方法:把外部作用域中的this对象保存在一个闭包能够访问的变量里,就可以让闭包访问该对象了。

3、内存泄漏

闭包会引用包含函数的整个活动对象。(重要!)

而其中包含着 element,即使闭包不直接引用element,包含函数的活动对象中也仍然会保存一个引用。

五、模仿块级作用域

1、

2、关于匿名函数的解释

3、关于临时创建一些需要的变量,就可以使用私有作用域。(很重要!)

在匿名函数中定义的任何变量,都会在执行结束时被销毁,因此,变量i只能在循环中使用,使用后被销毁。

而在私有作用域中能够访问变量count,是因为这个匿名函数是一个闭包,他能够访问包含作用域中的所有变量。

六、私有变量

1、介绍

2、特权方法

3、静态私有变量 (1)

创建了全局的构造函数。 创建了全局的变量,myobject。

(2)

在这个状态下,变量name变成了一个静态的、由所有实例共享的属性。

以这种方式创建私有变量会因为使用原型而增进代码复用,但每个实例都没有自己的私有变量。

七、模块模式

六种的模式是用于为自定义类型创建私有变量和特权方法的。

而模块模式则是为单例创建私有变量和特权方法的。

所谓单例,指的就是只有一个实例的对象。

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

八、增强的模块模式