js的闭包与作用域/作用域链

本文详细解释了JavaScript中的闭包概念及其应用场景,包括如何利用闭包保存变量状态及解决循环绑定事件的问题,并探讨了作用域与作用域链的工作原理。

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

闭包

首先说说闭包,闭包的官方定义:能够访问其他函数作用域的变量的函数,并且该函数可以起到让其他作用域中变量保存的作用。最常见的用法就是在父函数中

套用子函数来用闭包。为什么要用闭包呢,任何一个技术出现的前提必然是需求。要知道js中是没有静态变量的,函数变量在函数执行后立即被垃圾回收,我们当然可以用全局变量,但是过多的全局变量会导致代码难以维护,所以我们就要采用闭包。代码示例如下,在函数A执行后,匿名函数被外界引用,那么函数A中的变量i就没有随着函数A的执行完毕被垃圾回收,此变量一直保持在内存中。

function A(){

var i=1;

return  function(){

alert(++i);

}

}

var b=A();

b();//2

b();//3

闭包的第二种用法,就是循环绑定事件了,循环绑定如下事件后,单击每个div,触发的都是alert(9),因为代码是在单击时执行的,所以会去查找循环后的i变量i=10;

for (var i=0;i<10;i++){

div.bind('click',function(){

alert(i);

})

}

修改如下,讲变量i复制一份给index,则内部的匿名函数就形成了闭包,他可以让传递进来的index实参保存,不被垃圾回收。

for(var i=0;i<10;i++){

div.bind('click',(function(index){

return function(){

alert(index)

}

})(i))

}

作用域与作用域链

在此需要说一下执行环境的概念,作用域是语言中通用的概念,而作用域链与执行环境是js中特有的。执行一个函数时,都会进入一个执行环境,这个执行环境中存储了当前

作用域的方法和属性。当前执行环境在执行栈的最底层,window的执行环境在最上层。访问一个变量,如果在当前执行环境中不存在,则需要沿着作用域链向上层执行环境中

去查找。当前代码执行完毕,当前执行环境销毁,将执行权返还给上层的执行环境。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值