闭包函数详解
从技术的角度讲,全部的JavaScript函数都是闭包:它们都是对象,它们都关联到做用域链。当函数能够记住并访问所在的词法做用域时,就产生了闭包,即便函数是在当前词法做用域以外执行。
闭包的做用
闭包的应用比较典型是定义模块,咱们将操做函数暴露给外部,而细节隐藏在模块内部。
function fn1() { var name = 'iceman'; function fn2() { console.log(name); } return fn2; } var fn3 = fn1(); fn3();
这样就清晰地展现了闭包:算法
fn2的词法做用域能访问fn1的做用域闭包
将fn2当作一个值返回函数
fn1执行后,将fn2的引用赋值给fn3对象
执行fn3,输出了变量name递归
咱们知道经过引用的关系,fn3就是fn2函数自己。执行fn3能正常输出name,这不就是fn2能记住并访问它所在的词法做用域,并且fn2函数的运行仍是在当前词法做用域以外了。
正常来讲,当fn1函数执行完毕以后,其做用域是会被销毁的,而后垃圾回收器会释放那段内存空间。而闭包却很神奇的将fn1的做用域存活了下来,fn2依然持有该做用域的引用,这个引用就是闭包。ip
总结:一个函数在内部没法被调用,利用外部的函数返回值return让内部函数能够被调用。
关于递归函数的详细理解
递归算法是一种看似简单,但逻辑性比较复杂的算法,
通常用if须要设置好递归函数的结束条件,否则容易陷入死循环。内存
function f(n) {
if (n <= 1){
// console.log(1111);
return 1;
}else {
// console.log(n * f(n-1));
return n * f(n-1);
}
}作用域
console.log(f(10)); // 3628800
这样就清晰地展现了递归函数的运算:
递归的特色总结:io
优势,自调用,就是在函数里面调用本身.
缺点,就是消耗大量内存console
谢谢阅读,小编不容易,能够的话点个置顶呗。 谢谢。 喵喵喵~~~