1⃣️递归
阶乘函数:
function factorial(num){ if (num <= 1){ return 1; } else { 6 return num * factorial(num-1); } }
改装一:(arguments.callee指向正在执行的函数的指针,实现解耦)
function factorial(num){ if (num <= 1){ return 1; } else { return num * arguments.callee(num-1); } }
改装二:(解决严格模式下不能使用arguments.callee)
var factorial = (function f(num){ if (num <= 1){ return 1; } else { return num * f(num-1); } });
2⃣️闭包的作用域链
function createComparisonFunction(propertyName) { return function(object1, object2){ var value1 = object1[propertyName]; var value2 = object2[propertyName]; if (value1 < value2){ return -1; } else if (value1 > value2){ return 1; } else { return 0; }
}; }
var compare = createComparisonFunction("name"); var result = compare({ name: "Nicholas" }, { name: "Greg" });
在匿名函数从 createComparisonFunction()中被返回后,它的作用域链被初始化为包含 createComparisonFunction()函数的活动对象和全局变量对象。
so,compare的作用域链包含createComparisonFunction函数的活动对象(局部函数和局部属性,上述代码没有体现出来)和全局变量对象.看下面的例子:
var count = 100; var a = 2; function create(){ var count = 10; return function(){ console.log(count + a); } }; var b = create(); b();
这是一个典型的闭包,就像上面所说,b的作用域链被初始化为create函数的活动对象(count=10)和全局变量(a=2,count=100);所以执行b()的时候,count+a=10+2=12;
为什么是10+2,而不是100+2?请看这篇博客:js作用域链.