资讯专栏INFORMATION COLUMN

javascript - 闭包定义及应用场景

Xufc / 2760人阅读

摘要:什么是闭包闭包是指有权访问另一个函数作用域中的变量的函数。在内存中维持一个变量。

什么是闭包

闭包是指有权访问另一个函数作用域中的变量的函数。

function createFunc() {
    var name = "wheeler";
    return function () {
        return name;
    }
}

var nameFunc = createFunc();  // nameFunc是一个闭包

var name = nameFunc();

console.log(name);

// 解除对匿名函数的应用(以便释放内存)
nameFunc=null;

内部函数可以访问外部函数的变量name,内部函数的作用域包含了外部函数的作用域
(由于闭包会携带包含它的函数的作用域,可能导致内存占用过多,因此谨慎使用闭包)

可以通过模仿块级作用域减少闭包导致的内存占用过多
// 块级作用域(通常称为私有作用域)的匿名函数的语法
(function(){
    // 块级作用域
})();

将闭包定义在块级作用域里面

// 可以减少闭包占用的内存问题,因为没有指向匿名函数的引用。只要函数执行毕,就可以立即销毁其作用域链了
(function(){
    function createFunc() {
        var name = "wheeler";
        return function () {
            return name;
        }
    }

    var nameFunc = createFunc();

    var name = nameFunc();

    console.log(name);
})();
闭包的应用场景

用闭包模拟私有方法

var returnNum = (function () {
    var num = 0;

    function changeNum(value) {
        num = value;
    }

    return {
        add: function () {
            changeNum(10);
        },
        delete: function () {
            changeNum(-10);
        },
        getNum: function () {
            return num;
        }
    }
})();

// 闭包
console.log(returnNum.getNum());
returnNum.add();
console.log(returnNum.getNum());
returnNum.delete();
console.log(returnNum.getNum());

缓存

var CacheCount = (function () {
    var cache = {};
    return {
        getCache: function (key) {
            if (key in cache) {// 如果结果在缓存中
                return cache[key];// 直接返回缓存中的对象
            }
            var newValue = getNewValue(key); // 外部方法,获取缓存
            cache[key] = newValue;// 更新缓存
            return newValue;
        }
    };
})();

console.log(CacheCount.getCache("key1"));

封装

var person = function(){
    var name = "default";//变量作用域为函数内部,外部无法访问
    return {
        getName : function(){
            return name;
        },
        setName : function(newName){
            name = newName;
        }
    }
}();

console.log(person.name);// undefined
console.log(person.getName());
person.setName("wheeler");
console.log(person.getName());

setTimeout

function func(param) {
    return function() {
        console.log(param);
    }
}
var myFunc = func("wheeler");
setTimeout(myFunc, 1000);

保护函数内的变量安全。

在内存中维持一个变量。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/97618.html

相关文章

  • JavaScript闭包

    摘要:此时的作用域链包含了两个对象的活动对象和对象。闭包的应用场景保护函数内的变量安全。依然如前例,由于闭包,函数中的一直存在于内存中,因此每次执行,都会给自加。 引子 JS的闭包一直是很多人不理解,也是在使用过程中经常出现问题的地方。每次看文章都会有所了解闭包,但是,用起来还是不对,而且错误百出,其关键问题还是出在对其不理解,不了解。此文章会不定期更新以及完善,希望在我学习的时候,让大家也...

    Tony 评论0 收藏0
  • this指针使用call(),apply()bind()的使用

    摘要:目录一理解指针意义二用解决指针指向问题三的使用场景与少用之处一理解指针意义让我们先理解好指针的定义引用的是函数执行的环境对象永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的通俗地讲,就是谁调用,就指向谁我们分类举例举例前先看下本 目录 一.理解this指针意义二.用call(),apply(),bind()解决指针指向问题三.bind()的使用场景与少用之处 一.理解thi...

    iKcamp 评论0 收藏0
  • JavaScript:万恶的 this 拿命来(三)

    摘要:闭包执行上下文决定了变量作用域而闭包,它其实是一种决策,是一种模式,让我们可以灵活的改变变量作用域。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。只要咱们弄明白闭包,其中的自然跑不掉。 闭包 this 执行上下文决定了变量作用域 而闭包,它其实是一种决策,是一种模式,让我们可以灵活的改变变量作用域。 按惯例,上栗子 var global = glo...

    Cympros 评论0 收藏0
  • 闭包

    摘要:闭包在计算机科学中,闭包是词法闭包的简称,是引用了自由变量的函数。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。通过闭包完成了私有的成员和方法的封装。 闭包 在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,...

    ccj659 评论0 收藏0
  • 一篇文章搞懂闭包

    摘要:如果非要用一句话定义闭包我更加认同你不知道的作者的一句话当函数可以记住并访问所在的词法作用域时,就产生了闭包。所以本文将会从闭包的应用场景入手,来印证的这句话。总结闭包的应用场景还有很多,可以说是随处可见了。 直接进入主题,闭包是什么? 闭包是写代码过程产生的一种自然结果,而不是一种概念。 相比于一些概念性的解释,更重要的是熟悉它的应用场景、及常见写法。 如果非要用一句话定义闭包:我...

    tinyq 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<