JavaScript的闭包

本文深入探讨JavaScript闭包的概念,展示了如何使用闭包实现比较函数、解决循环中的变量问题及模拟块级作用域。通过具体代码实例,帮助读者理解闭包的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaScript闭包

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

function compare(prop) {
    return function (obj1, obj2) {
        let val1 = obj1[prop];
        let val2 = obj2[prop];

        if (val1 < val2) return -1;
        else if (val1 === val2) return 0;
        else return 1;
    };
}

var obj1 = {
    age: 20,
    name:'obj1'
};

var obj2 = {
    age: 2,
    name:'obj2'
};

var array = [obj1, obj2];
array.sort(compare('age'));
console.log(array); //[ { age: 2, name: 'obj2' }, { age: 20, name: 'obj1' } ]

我们在compare函数内部创建了一个匿名函数,由于匿名函数位于compare内部,所以可以访问compare的参数prop,这样就通过闭包访问了别的函数中的变量,延长了变量的生命周期。

需要注意的是,闭包保存的是所外层函数中的变量对象,而不是变量本身的值

function createFuncs() {
    var res = [];
    for (var i = 0; i < 10; i++) {
        res[i] = function () {
            return i;
        };
    }
    return res;
}

console.log(createFuncs()[0]());//10
console.log(createFuncs()[2]());//10
console.log(createFuncs()[9]());//10

如上所示,如果想用这种方式保存每次循环中i的值是错误的做法。因为所创建的匿名函数的作用链中都保存着createFuncs函数的活动对象,所以他们每次引用的都是用一个变量i,即res中保存的函数中都只能返回i的最后一个值,10。

解决的这种问题的方法也很简单:

function createFuncs() {
    var res = [];
    for (var i = 0; i < 10; i++) {
        res[i] = function (num) {
            return function(){
                return num;
            };
        }(i);
    }
    return res;
}

console.log(func()[0]());//0
console.log(func()[2]());//2
console.log(func()[9]());//9

如上所示,我们没有直接把闭包的值赋给数组,而是定义一个匿名函数接收即将返回的值,并执行它。我们知道JavaScript中函数参数是值传递的,所以传递给匿名函数的参数会被复制一个副本,并返回出来。

  • 模拟块级作用域

    由于JavaScript没有会计作用域的概念,这意味着只要是在函数内部,无论是否在语句块中生命的变量,出了语句块依然可以访问的到。

    function foo(){
    for(var i = 0; i < 10; i++){} 
    console.log(i);//10
    }

    如上代码,出了for循环依然可以访问变量i

    由于JavaScript的最小作用域就是函数内部,所以我们可以借助匿名函数来模拟块级作用域。如下所示:

    function foo(){
    function(){
      var i = 0 ;
    }
    console.log(i);//Unexpected token
    } 

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值