• 手机版

    扫码体验手机版

  • 微信公众号

    扫码关注公众号

国内首家协议开发

软芯音视解码保护平台

在线
客服

发布
需求

在线
聊天

天盟
APP

天盟APP下载

关注
微信

微信扫一扫访问
顶部

为什么这里无法访问到闭包里的b变量?

044001v2zdjrdpgimeoonn.jpg

免责声明:本内容仅代表回答会员见解不代表天盟观点,请谨慎对待。

版权声明:作者保留权利,不代表天盟立场。

使用道具 举报

全部参与3

全局变量作用域,你写成这样:
functiona(){        varb=22;        returnfunction(){                setTimeout(alert(b),1000)        }}a()()setTimeout的第一个参数可以是字符串,也可以是一个函数。如果是字符串会在全局作用域下执行(你的全局作用域上没有b)。

使用道具 举报

这种情况的setTimeout解析字符串很容易出问题的,这是js这种语言本身的原因
如果改成 setTimeout(alert(b),1000) //这样会有bug,没有1秒的延迟效果

或者setTimeout(function () {
  alert(b)
},1000)
用匿名函数就能完美解决了。

使用道具 举报

varb=33;                functiona(){                        varb=22;                        returnfunction(){                                console.log(b);//22                                window.setTimeout("console.log("+b+")",1000);//22                                window.setTimeout("console.log(b)",1000);//33                        }                }                                a()();本身对这个问题内部运行也不是太清楚明了,偶然写出来试了一下,觉得大概是因为setTimeout中b的问题.
如楼主截图中,直接使用"console.log(b)",a()执行后返回的函数中,没有变量b,只有字符串b,所以没有一个变量对函数内部的b=22保持引用,在a()()时,执行的结果便是b在全局中查到的33。而如果换做第二种写法,a()执行后,存在b变量,对b=22保持了引用,所以在a()()时,得出22。

使用道具 举报

发新帖

发布任务需求已有1031289位用户正在使用天盟网服务

发布分类: *
任务预算: *
需求内容: *
手机号码: *
任务商家报价为
  • 预算价 :
  • 成交价 :
  • 完工期 :
  • 质保期 :

* 最终任务项目以服务商报价、双方协商为准!