关于闭包里面,函数表达式赋值
function F1(){
var a = 100;
return function(){
console.log(a);
}
}
var f1 = F1();
var a = 200
console.log(f1);
f1打印结果:

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()里面找。
辛苦老师解答。
正在回答
同学你好,关于同学的问题回答如下:
1、同学理解的var f1 = F1() 这行代码就相当于:
var f1 = function(){
console.log(a);
}是正确的,此时f1就是函数名,所以我们在打印的时候,得到的就是f1这个函数,而不是函数这个结果,如果需要调用这个函数,需要加小括号:

2、f1.a这样去访问a是访问不到的,因为a并不是f1函数上的属性,而是F1函数里面的一个变量,这样对象.属性名来访问属性值,是访问不到的,所以是undefined。
3、我们来看下函数调用之后的打印结果:

控制台:

详解见注释:

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

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

如果我的回答帮助了你,欢迎采纳,祝学习愉快~
- 参与学习 人
- 提交作业 239 份
- 解答问题 10739 个
本阶段带你深入前端开发的肌理,通过ES6基础知识和前端主流高级框架的学习,助你快速构建企业级移动webAPP应用,进入职场的终极battle
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星