先上代码function a() { var temp = 10; function b() { console.log(temp); // 10 } b();}a();function a() { var temp = 10; b();}function b() { console.log(temp); // 报错}a();模模糊糊有个作用域的概念,但是无法清楚明白的说出来,请大佬指点~*打印出a函数的原因是将变量和函数取为同名了,现在已修改
5 回答
慕容森
TA贡献1853条经验 获得超18个赞
第一段代码相信没啥问题,函数b
执行是能取到其父函数a
作用域下的变量a
。
第二段由于函数a
和函数b
是同级函数,变量a
是在函数a
的作用域下,且没有全局作用域下的变量a
的声明,所以报错。
慕尼黑5688855
TA贡献1848条经验 获得超2个赞
第二种,怎么会是报错呢?不太明白题主的报错是什么意思,a是一个函数,输出函数不会报错
调用函数时函数内调用的变量会在本函数内或定义函数的作用域向外找
在定义函数的作用域找而非调用的作用域:
function a(){
console.log(b);
}
let b = 10
{
let b = 1;
a();//10
}
当调用b的时候,b会在本函数内找a,没有向外找,去定义b的作用域(全局)找a,这时a是全局函数找到了,然后输出a
芜湖不芜
TA贡献1796条经验 获得超7个赞
简单介绍作用域:作用域说白了就是一套规则,一套存储变量,并可以访问变量的规则。作用域类型可以分为:词法作用域、函数作用域以及块作用域。涉及到词法作用域就不能不提闭包这个非常有用而又神秘的概念。当某个函数可以记住并访问所在的词法作用域,且在当前词法作用域之外执行时就产生了闭包。
当然作用域不止这些东西。因为javascript其实最难的就三个东西:作用域、原型、异步,要彻底理解还是需要花点时间慢慢跑几个demo才行的。
讲完作用域,在回头看看你的代码:
上面的函数b打印a之所以报错,是因为变量a是在函数a中定义的,b是没有这个变量的,所以就报错了。
qq_笑_17
TA贡献1818条经验 获得超7个赞
添加回答
举报
0/150
提交
取消