面试官:谈谈对JS闭包的理解及常见应用场景(闭包的作用)

对JS闭包的理解及常见应用场景(闭包的作用)

使用闭包主要为了设计私有的方法和变量。

  • 优点是可以避免变量的污染
  • 缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。

在js中,函数即闭包,函数才会产生作用域的概念。

1.变量作用域

变量作用域两种:全局变量局部变量。js中函数内部可以读取全局变量,函数外部不能读取函数内部的局部变量。

2.如何从外部读取函数内部的变量?

function f1(){
        var n = 123;
        function f2(){    //f2是一个闭包
            alert(n)
        }    
        return f2;
    }
  • js链式作用域:子对象会一级一级向上寻找所有父对象的变量,反之不行。
  • f2可以读取f1中的变量,只要把f2作为返回值,就可以在f1外读取f1内部变量

3.闭包概念

  • 能够读取其他函数内部变量的函数。
  • 或简单理解为定义在一个函数内部的函数,内部函数持有外部函数内变量的引用。

4.闭包用途

  • 读取函数内部的变量
  • 让这些变量的值始终保持在内存中。不会在f1调用后被自动清除。
  • 方便调用上下文的局部变量。利于代码封装。
    原因:f1是f2的父函数,f2被赋给了一个全局变量,f2始终存在内存中,f2的存在依赖f1,因此f1也始终存在内存中,不会在调用结束后,被垃圾回收机制回收。

5.闭包的理解

来几个例子:

/**
 * [init description]
 * @return {[type]} [description]
 */
function init() {
    var name = "Chrome";    //创建局部变量name和局部函数alertName

    function alertName() { //alertName()是函数内部方法,是一个闭包
        alert(name); //使用了外部函数声明的变量,内部函数可以访问外部函数的变量
    }
    alertName();
}
init();

一个变量在源码中声明的位置作为它的作用域,同时嵌套的函数可以访问到其外层作用域中声明的变量

/**
 * [outFun description]
 * @return {[type]} [description]
 */
function outFun(){
    var name = "Chrome";
    function alertName(){
        alert(name);
    }
    return alertName;   //alertName被外部函数作为返回值返回了,返回的是一个闭包
}

var myFun = outFun();
myFun();

闭包有函数+它的词法环境;
词法环境指函数创建时可访问的所有变量。
myFun引用了一个闭包,闭包由alertName()和闭包创建时存在的“Chrome”字符串组成。
alertName()持有了name的引用,
myFunc持有了alertName()的的访问,
因此myFunc调用时,name还是处于可以访问的状态。

/**
 * [add description]
 * @param {[type]} x [description]
 */
function add(x){
    return function(y){
        return x + y;
    };
}

var addFun1 = add(4);
var addFun2 = add(9);

console.log(addFun1(2)); //6
console.log(addFun2(2));  //11

add接受一个参数x,返回一个函数,它的参数是y,返回x+y
add是一个函数工厂,传入一个参数,就可以创建一个参数和其他参数求值的函数。
addFun1和addFun2都是闭包。他们使用相同的函数定义,但词法环境不同,addFun1中x是4,后者是5

6.闭包应用场景

setTimeout传参

//原生的setTimeout传递的第一个函数不能带参数
setTimeout(function(param){
    alert(para
  • 58
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 26
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值