一、JavaScript Function 对象


函数与 Function 对象

  - 在JavaScript中,函数也是以对象的形式存在的,每个函数都是一个Function对象实例

wKioL1b47MDQ5NPiAAAki9a8DR8141.pngwKiom1b47DPgqtHgAAAdPG37R78626.png


arguments 对象

  - 每个函数对象都有一个arguments属性;此属性只能在函数执行体内使用

  - arguments属性中保存着当前函数接收到的所有实际参数,故可以使用arguments属性处理可变数量的参数

  - arguments对象具有如下属性:

      - length:返回实际传入的参数的个数

      - callee:返回当前函数的引用(匿名函数可以使用该属性实现递归调用)


二、JavaScript 创建函数


创建函数

  - JavaScript中创建函数的三种方式

      - 使用function关键字声明命名函数

      - 使用直接量方式声明命名函数

      - 使用Function对象构造方法创建函数


使用直接量方式创建函数

  - 使用直接量方式创建函数

wKiom1b47k2hymoHAAAkaLw6qCE098.pngwKioL1b47wLT6HSlAABfjtBpk1o184.png    

使用 Function 对象创建函数

  - 使用 Function 对象直接创建函数

wKioL1b470agyVrNAAAlJUy-8xg425.pngwKiom1b47rzBngwBAACMglOcISg480.png

方法三种定义方式的对比

  - 仅以声明方式定义的方法,会被声明提前

  - 代码动态执行:

      - 以声明方式和直接量方式定义的方法,方法体固定。无法在运行时动态执行

      - 以创建对象方式定义的方法,方法体是字符串。可以在运行时动态创建,修改,并执行字符串格式的方法体

  - 效率:

      - 以创建对象方式定义的方法,因为方法体是字符串,需要再次解析。所以执行效率低

      - 其它两种方法定义方式不存在效率问题


三、JavaScript 匿名函数


匿名函数

  - 匿名函数,就是定义时未直接指定名称的函数wKioL1b48WihOVsVAAA3WFloxwQ130.png

  - 也可以直接定义匿名函数

wKioL1b48Y2z_I_nAAAht4d76Y4362.png


匿名函数的应用

  - 回调函数,将一个函数作为另一个函数的参数叫做回调函数

wKiom1b48mvz4eKrAAA07BQB9_k097.png

  - 自调函数,定义一个匿名函数即调用

wKiom1b48oeiXZaQAAAqQYz471I268.png


四、JavaScript 闭包


变量作用域

  - 变量作用域是程序中定义这个变量的区域

      - 全局变量拥有全局作用域

      - 局部变量(函数内的变量),其作用域是局部性的

  - 函数作用域

      - 变量在声明它的函数体以及这个函数体内嵌套的任何函数体内都是有定义的


作用域链

  - 作用域链:是专门保存一个函数可用变量存储位置的对象

  - 任何一个函数对象都对应一个作用域链对象

      - 作用域链中按顺序引用了函数可以使用的变量所在的对象

      - 作用域链中对象按从局部到全局的顺序引用

  - 定义方法时,作用域链中仅引用了全局对象window

wKioL1b49MKSKT09AABzuopCqYE994.png

  - 当调用一个函数时,js引擎会动态为本次方法调用创建一个活动对象。活动对象中保存了方法可用的局部变量

  - 当方法执行时,需要使用一个变量。将从作用域链中按从局部到全局的顺序,查找变量的所在位置

      - 只要找到,就不再继续查找

      - 如果找到全局都没有,就报错

      - 在任何位置,为一个未声明的变量赋值,都会在全局创建该变量。

      - 函数执行完,作用域链中的活动对象引用和活动对象被释放

  - 作为 JavaScript 的顶层代码,其作用域链中只有一个对象即全局对象,对于浏览器客户端而言就是window

wKioL1b49yCzX9DQAACREzyvpbY232.png


匿名函数的优点

  - 因为非匿名函数在定义时,就已创建函数对象和作用域链对象。所以,即使未调用,也占用内存空间

  - 匿名函数,仅在调用时,才临时创建函数对象和作用域链对象。调用完,立刻释放

  - 所以,匿名函数比非匿名函数更节省内存空间


闭包

  - 闭包:词法表示包括不必计算的变量的函数,也就是说,该函数能使用函数外定义的变量

wKiom1b49sCQwayrAAAr1xaCsH0025.pngwKiom1b49tmj-ZzfAADvzja5tJE575.pngwKioL1b496mBnMZCAACV730UVVM227.pngwKiom1b49yGA1ufhAAC7EXxiWKk829.pngwKiom1b490qzg-zfAAG-e-UwVA0675.png

闭包应用特征

  - 局部变量

      - 在函数中定义有共享意义(如:缓存、计数器等)的局部变量(注:定义成全局部变量会对外造成污染)

  - 内嵌函数

      - 在函数(f)中声明有内嵌函数,内嵌函数(g)对函数(f)中的局部变量进行访问

  - 外部使用

      - 函数(f)向外返回此内嵌函数(g),外部可以通过内嵌函数持有并访问声明在函数(f)中的局部变量,而此变量在外部是通过其他途径无法访问的


闭包的作用

  - 闭包的主要作用是:

      - 提供可共享的局部变量

      - 保护共享的局部变量,提供专门的读写变量的函数

      - 避免全局污染


闭包的应用

  - Getter与Setter

wKiom1b4-Ifj3HrbAADcl5-sXPU166.png


 总结:本章内容主要介绍了 JavaScript Functions (Function对象、创建函数、匿名函数、闭包)