zoukankan      html  css  js  c++  java
  • JavaScript高程第三版笔记-函数表达式

    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作用域链.

    注意:

    createComparisonFunction() 函数在执行完毕后,其活动对象也不会被销毁,因为匿名函数的作用域链仍然在引用这个活动对象。换句话说,当createComparisonFunction()函数返回后,其执行环境的作用域链会被销毁,但它的活动对象仍然会留在内存中;直到匿名函数被销毁后,createComparisonFunction()的活动对象才会被销毁.

    也就是说,上述代码所示,局部变量count会一直留在内存中,除非手动解除对匿名函数的引用

    create = null;
  • 相关阅读:
    js兼容性问题总结
    style设置/获取样式的问题 和 offsetWidth/offsetHeight的问题
    常用SQL总结
    完美运动框架,兼容性好,可多次调用
    JS—实现拖拽
    java设计模式——享元模式
    java设计模式——适配器模式
    java设计模式——装饰者模式
    java设计模式——外观模式(门面模式)
    java设计模式——单例模式(三)
  • 原文地址:https://www.cnblogs.com/eco-just/p/11327892.html
Copyright © 2011-2022 走看看