• 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对象、基本类型和字面量的区别
    本地数据访问时出现跨域问题Cross origin requests are only supported for protocol schemes: ……
    checkbox操作判断 Jquery选择器
    HTML5经典实例——1基础语法和语义
  • 原文地址:https://www.cnblogs.com/eco-just/p/11327892.html
Copyright © 2020-2023  润新知