一个考查作用域以及闭包的题目

var a = 2;
var func = (function(){

var a = 3;
return function(){
    a++;
    console.log(a);
}

})();

func();
func();

1.涉及的知识点:
(1)JS变量的作用域
(2)闭包
2.变量的作用域,通俗来说就是变量所能起到作用的范围,也就是变量能被访问到的范围。
对于变量的作用域的理解,有一下几点需要了解的:
(1)变量的作用域不是“块级”,而是以“函数”为作用域

 这个所说的的“块级”,指的是距离“代码”最近的代码块。比如举个C#的例子:
        public void Param()
        {
            var a = 1;
            if(a==1){
                var b = c;
            }
        }
 变量a的作用域就是 Param()这个代码快,而变量b的作用域的作用域就是if所表示的代码块。
        
 来看个JavaScript的例子:
        function param () {
            {
                var a = "liyunhua"
            }
            console.log(a); // 输出 liyunhua
        }
        console.log(a) // error
        
  变量a在params()中都是可以被访问的,而出了param()的范围就会报错。

(2)变量的覆盖:“一个作用域中存在一个与外层作用域的同名变量,那么在内部作用域以及其内部的所有的作用域中都访问不到外面的变量”--摘自《深入理解JavaScript》

        这句话还是比较好理解的。这里就不做解释了。
    理解了上面的两点,那么在立即执行函数表达式(IIFE)中,a的初始值就是3,并且不会影响到外部作用域变量a的值。执行函数(IIFE)中,a的初始值就是3,并且不会影响到外部作用域变量a的值。
3.闭包
  闭包的东西太多,这里就以题论题,不会过多地讲述闭包的知识点。有兴趣的朋友,可以去这个链接了解 
 (https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures)。
  这里说闭包的一个作用:使函数可以维持其创建时所在作用域。
  怎么理解这句话呢?
      也就是说一个函数离开了“创建时的作用域”,但是其还是会和这个作用域以及这个函数外部的作用域相关联,也就是说“变量”依旧是那个“变量”
  以这个题目为参照,那么结果就很明了了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值