为了账号安全,请及时绑定邮箱和手机立即绑定

js作用域相关问题

js作用域相关问题

ABOUTYOU 2019-03-07 18:15:44
先上代码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的声明,所以报错。


查看完整回答
反对 回复 2019-03-18
?
慕尼黑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


查看完整回答
反对 回复 2019-03-18
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

简单介绍作用域:作用域说白了就是一套规则,一套存储变量,并可以访问变量的规则。作用域类型可以分为:词法作用域、函数作用域以及块作用域。涉及到词法作用域就不能不提闭包这个非常有用而又神秘的概念。当某个函数可以记住并访问所在的词法作用域,且在当前词法作用域之外执行时就产生了闭包。
当然作用域不止这些东西。因为javascript其实最难的就三个东西:作用域、原型、异步,要彻底理解还是需要花点时间慢慢跑几个demo才行的。

讲完作用域,在回头看看你的代码:
上面的函数b打印a之所以报错,是因为变量a是在函数a中定义的,b是没有这个变量的,所以就报错了。


查看完整回答
反对 回复 2019-03-18
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

es6之前javascript只有全局作用域和函数作用域,没有块级作用域。要么就是全局,要么就是函数作用域。函数可以访问父级函数的变量,反过来则不行。函数里的变量只能在函数内部访问,外部则不行。第一个a函数里面有一个b函数,实际上这是一个闭包,a函数外部不能访问a函数内部的a变量。第二个,函数a和函数b都在全局作用域下,a函数不能访问b函数内部的变量,b函数也不能访问a函数内部的变量,所以才会报错。


查看完整回答
反对 回复 2019-03-18
  • 5 回答
  • 0 关注
  • 652 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信