问题:
有多少种函数声明的方式?
不同函数类型如何影响上下文的变量对象?
知识点:
函数
在ECMAScript中,有三中函数类型:函数声明,函数表达式和函数构造器创建的函数。
---函数声明FD
有一个特定的名称;
在源码中的位置:要么处于程序级(Program level),要么处于其它函数的主体(FunctionBody)内;(只有这两个位置可以声明)
进入执行上下文阶段创建;
影响变量对象(上下文的VO);
以 function exampleFunc() { ... } 形式创建。
---函数表达式FE
在源码中须出现在表达式的位置;
有可选的名称;
在代码执行阶段创建;
以 var exampleFunc = function() { ... } 形式创建;
作用:
不污染变量对象(不影响变量对象)
通过创建封装的闭包隐藏辅助性数据
该领域涉及到立即调用的知识点,即圆括号。(见《立即调用与自执行》笔记~)
为什么不污染变量对象?先看代码:-- (补充于2015.08.25 21:26)
函数表达式不存在变量对象内(在内存中),所以我们一般结合能影响变量对象的变量(初始化为undefined),完成对其进行访问,如下:
命名函数表达式NFE:
出现在递归调用中;
解析器在代码执行阶段遇到命名函数表达式时,在FE创建之前,它创建了辅助的特定对象;
特定对象被添加到当前作用域链的最前端;
特定对象以FE的名字作为唯一属性,属性值引用到了FE上。
执行完毕后删除特殊对象。
例子如下:
---函数构造器创建的函数 (不大明白,待补充)
通过函数构造器 Function( ... ) 创建的函数,[[Scope]]属性只包含全局对象;
Function构造器既可以用new关键字也可以不用;
-----------
函数其他特点
可以作为参数,称为函数式参数;
接受函数式参数(函数的参数)的函数称为高阶函数(或函数式函数或偏数理或操作符);
作为返回值的函数称为带函数值的函数;
以上3个被称作第一类函数(一般说第一类对象),在ECMAScript中,在ECMAScript中,所有函数都是第一类对象;
接受自己作为参数的函数称为自应用函数;
以自己为返回值的函数称为自复制函数。