// 递归
function faciorial(num) {
if (num < 10) {
return num;
} else {
// argument.callee是一个指向正在执行的函数,但是再严格模式下会报错。可以使用函数表达式的方式
return arguments.callee(num) * 2
}
}
// 使用函数表达式实现递归
const faciorial1=(function f(){
if (num < 10) {
return num;
} elsec {
return f(num) * 2
}
})
faciorial(2)
faciorial1(2)
/**
* 闭包 一个函数可以访问另外一个函数的变量可以称为闭包,如何形成的闭包?为什么一个函数会可以访问另外一个函数的变量?
* 这个从作用域链说起,当一个函数被创建时,会创建一个执行环境和对应的作用域链,然后使用arguments和其他命名的参数来初始化活动对象
* 再作用域链里,外部函数的活动对象始终第二位,外部函数的外部函数的活动对象再第三位。
* faciorial 函数第一层活动是他本身里面包含 num和arguments。第二层活动对象则是全局函数。一般函数在执行完毕后,活动对象会被销毁
* 然而闭包不同。闭包会将他可以访问的函数的活动对象加到自己的作用域链中。闭包执行完毕,起活动对象不会被销毁,只有取消对闭包对象的引用,
* 可以销毁闭包对象
**/
function createFunctions(){
var result=new Array();
for(var i=0;i<10;i++){
result[i]=function(){
return i;
}
}
return result; // 返回10 因为每个函数的作用域链中都包含着createFunctions的活动对象。
}
// 改写可以返回0 1的
function createFunctionss(){
var result=new Array();
for(var i=0;i<10;i++){
result[i]=function(num){
return function(){
return num;
}
}
}(i)
return result;
}