关于闭包里面,函数表达式赋值

关于闭包里面,函数表达式赋值

        function F1(){
            var a = 100;
            return function(){
                console.log(a);
            }
        }
        var f1 = F1();

        var a = 200

        console.log(f1);


f1打印结果:

http://img1.sycdn.imooc.com//climg/5e44f75909fe4cd303180064.jpg


f1这个函数里面只有F1()的返回值。var f1 = F1() 这行代码就相当于:

var f1 = function(){

        console.log(a);

}

但执行f1()之后a值是100;视频里有说函数的父级作用域是定义时候的作用域而不是执行时候。这句话我理解。

但是var f1=F1();之后f1内部只有一行代码,就是console.log(a)。并没有把F1本身的var a = 100这句代码放在自身内部。

我的猜想是var f1 = F1();的时候,f1是可以访问到F1()中,a的值。

我尝试在var a = 200;之前加了一行代码:

        console.log(f1.a);
打印结果是undefined…这说明f1自身没有或者没办法访问到a值的吧。

……表达的有些混乱。反正就是不太理解。为什么f1内部只一个console.log(a)。这个a为什么不从全局作用域里找,而去F1()里面找。


辛苦老师解答。

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,关于同学的问题回答如下:

1、同学理解的var f1 = F1() 这行代码就相当于:

var f1 = function(){
  console.log(a);
}

是正确的,此时f1就是函数名,所以我们在打印的时候,得到的就是f1这个函数,而不是函数这个结果,如果需要调用这个函数,需要加小括号:

http://img1.sycdn.imooc.com//climg/5e4501dd09bccc4105150118.jpg

2、f1.a这样去访问a是访问不到的,因为a并不是f1函数上的属性,而是F1函数里面的一个变量,这样对象.属性名来访问属性值,是访问不到的,所以是undefined。

3、我们来看下函数调用之后的打印结果:

http://img1.sycdn.imooc.com//climg/5e4502c409f1dd9505550343.jpg

控制台:

http://img1.sycdn.imooc.com//climg/5e4502d6090e2e8c04730078.jpg

详解见注释:

http://img1.sycdn.imooc.com//climg/5e45047009b4497c08270506.jpg

3、我们在前面学过作用域链,也就是变量会依次向上层寻找,在f1中,要打印a,那么a就往上一个作用域F1函数下寻找,此时F1函数下定义了a值且为100,那么打印出来就是100,就不会再向上查找了,如果F1下并未定义a,a是在全局进行定义的:

http://img1.sycdn.imooc.com//climg/5e450597097e65b608420302.jpg

此时的a就是全局的200了:

http://img1.sycdn.imooc.com//climg/5e4505ab09ebe34c02180035.jpg

如果我的回答帮助了你,欢迎采纳,祝学习愉快~

  • 夜魇丶 提问者 #1
    感谢老师解答。老师回答的这些我能看明白…不理解的地方就在于var f1 = F1();这一步里面,f1有F1()的返回值,那么f1内部其实也是可以访问到F1()里面的变量的吧。感觉我是闭包没有学明白。
    2020-02-13 17:30:37
  • 好帮手慕粉 回复 提问者 夜魇丶 #2
    同学你好,是的,f1可以访问F1的变量,a就是访问的F1的变量。如果我的回答帮助了你,欢迎采纳,祝学习愉快~
    2020-02-13 18:20:03
提问者 夜魇丶 2020-02-13 15:56:42

嗯 我好像有点明白了。我想的是var f1 = F1();

然后f1自己成为了一个新的函数,内部只有一行console.log的代码;

但f1应该只是引用了F1();里面的地址。f1的值指向了F1();return出来的东西。这个return的东西还是在F1();内部。

所以执行f1的时候,return 出来的函数里面没有a值,就向当前父作用域寻找,找到上面的a=100,最终打印这个a值。


…也不知道是不是这么理解。


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师