• 《Javascript高级程序设计》读书笔记之闭包


    闭包

    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: "Jim" }, { name: "Jack" });
    //解除对匿名函数的引用,以便释放内存
    compare = null;
    View Code

    匿名函数从createComparisonFunction()中被返回后,它的作用域链被初始化为包含createComparisonFunction()函数的活动对象和全局变量对象。

    这样,匿名函数可以访问在createComparisonFunction()中定义的所有变量,同时,createComparisonFunction()函数执行完毕后,其活动对象也不会被销毁,因为匿名对象的作用域链仍然引用这个活动对象。

    直到匿名函数呗销毁后,createComparisonFunction()函数的活动对象才会被销毁

    闭包与变量

    下面代码片段中,片段1中,每个函数的作用域中都保存着createFunctions()函数的活动对象,所以他们都应用的是同一个变量i。createFunctions()函数执行完后,i为5,所以每个匿名函数内部i的值都是5

    片段2中,在返回的匿名函数外部,再创建一个匿名函数,并将立即执行该匿名函数的结果赋给数组。函数参数按值传递,变量i的当前值赋值给num,匿名函数内部,创建了访问该num变量的闭包。

    //代码片段1
    function createFunctions() {
        var result = new Array();
        for (var i = 0; i < 5; i++) {
            result[i] = function () {
                alert(i);
            }
        }
        return result;
    }
    
    var funcs = createFunctions();
    //Array.forEach()
    funcs.forEach(function (item) { item(); }); //5,5,5,5,5
    
    
    //代码片段2
    function createFunctions() {
        var result = new Array();
        for (var i = 0; i < 5; i++) {
            result[i] = function (num) {
                return function () {
                    alert(num);
                }
            } (i);
        }
        return result;
    }
    
    var funcs = createFunctions();
    //Array.forEach()
    funcs.forEach(function (item) { item(); }); //0,1,2,3,4
    View Code

    闭包中的this

    var name = "The Window";
    var object = {
        name: "My Object",
        getNameFunc: function () {
            return function () {
                return this.name;
            }
        }
    };
    
    alert(object.getNameFunc()()); //"The Window"
    View Code

    object.getNameFunc()返回一个匿名函数,在全局环境调用该函数,this指向的全局对象

    解决这一问题,可以将匿名函数外部作用域中this对象保存在闭包能够访问到的变量中

    var name = "The Window";
    var object = {
        name: "My Object",
        getNameFunc: function () {
            var that = this;
            return function () {
                return that.name;
            }
        }
    };
    
    alert(object.getNameFunc()()); //"My Object"
    View Code
  • 相关阅读:
    DRF项目之视图获取路径参数
    DRF项目之层级关系
    DRF项目之序列化器和视图重写方法的区别
    DRF项目之自定义分页器
    DRF项目之实现用户密码加密保存
    DRF项目之通过业务逻辑选择数据集和序列化器
    DRF项目之自定义JWT认证响应数据
    PIP一次性导入所有环境和指定镜像源
    DRF项目之JWT认证方式的简介及使用
    DRF项目之解决浏览器同源策略问题
  • 原文地址:https://www.cnblogs.com/GongQi/p/4034002.html
Copyright © 2020-2023  润新知