js高级程序设计
第7章内容总结
1 函数表达式的特征
2 使用函数实现递归
3 使用闭包定义私有变量
声明提前
1 .函数声明和函数表达式存在区别:
abc(); //Uncaught TypeError: abc is not a function
var abc = function(){
console.log("hello world");
}
abc(); //hello world
function abc(){
console.log("hello world");
}
2.递归
例:
function factorial(num) {
if(num <= 1){
return 1;
} else {
return num*factorial(num-1);
}
}
arguments.callee是指向正在执行函数的指针,可以减少耦合度。防止出现下列情况:
var abc = factorial;
abc(); //报错
3.闭包
(1)全局初始化,由 js 引擎构建一个ecs执行环境栈,作用维持执行顺序,再创建ec执行环境Object代表全局对象,(由于不能直接访问Object,通过window对象指向Object访问。)
outer代码段存在执行环境中。
(2)开始执行outer函数,outer() 被push入ECS,同时创建出AO对象,它自身的AO对象排在作用域链的最顶端,parent属性指向了它的上一级window.(方便js引擎查找变量属性的位置)()
(3)outer函数内部返回匿名函数,函数创建,同时scope指向当前的AO。
scope总是指向定义函数时所在的环境。
(5)
(6)最后,i加到了outer的ao上,由于AO对象的限制作用没有办法回收而被保留了下来。