一个典型的例子理解JavaScript作用域以及变量提升

来源:互联网 发布:base64 json 图片 编辑:程序博客网 时间:2024/06/05 16:36

例子:

var a = 1;  function b() {      a = 10;      return;      function a() {}  }  b();  alert(a);  // 结果为1

一开始我是很困惑的,为什么结果不是10,a是一个全局变量,在函数b中被修改成了10那么输出就应该是10啊,当我把function a() {} 这一条语句注释掉,再次运行结果就是为10,所以我判定函数a有很大的问题

现在了解了作用域和变量提升终于明白了,先来画一个作用域链,可以参考我的文章http://blog.csdn.net/qq_26725075/article/details/76718331

因为这次的作用域链中要加入变量声明才容易理解,所以我修改了作用域链的画法
这里写图片描述
红色的是作用域中的变量对象

变量提升即将变量声明提升到它所在作用域的最开始的部分,即:

function b() {}; //函数提升var a;  //变量提升a = 1;  function b() {      function a() {}  //函数提升    a = 10;      return;      function a() {}      }  b();  alert(a);

执行到b()进入了函数b的作用域,把函数a声明提升,此时开始执行a = 10;这条语句,重点来了,根据作用域链的规则:局部作用域开始时会先在自己的变量对象中搜索变量和函数名,如果搜索不到则再搜索上一级作用域链,所以说当执行a = 10;这条语句时,发现在当前作用域中是有着变量a的(类型为function),所以不会去父级作用域中寻找变量类型为number的a,执行完语句之后函数b作用域中的function a变成了number a,并且被赋予了10,用代码来验证:

var a = 1;      function b() {          alert(typeof a);        a = 10;          alert(typeof a);        alert(a);        return;          function a() {}     }      b();      alert(a);   //结果是function number 10 1   

当return,返回window作用域,函数b的作用域被销毁,此时全局变量a的值始终没有被改变,仍然为1

此文章是根据http://blog.csdn.net/sunxing007/article/details/9034253博文总结而来的

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 意外怀孕明明一直用安全套的怎么办 找不到百度网盘的dns地址怎么办 小米众筹到了发货时间不发货怎么办 不知道电脑宽带连接账号密码怎么办 电脑如果宽带账号密码忘记了怎么办 xp电脑用户名和密码忘了怎么办 电脑的用户名和密码忘记了怎么办 电脑重置后需要用户名和密码怎么办 电脑登录用户名和密码忘记了怎么办 电脑登录用户名和密码忘了怎么办啊 微信无意中点了允许登录怎么办 qq号码登录微信无法验证怎么办 注册微信公众号邮箱激活不了怎么办 不是自己申请的qq号忘密码怎么办 联通宽带拨号账号密码忘记了怎么办 忘了路由器的用户名和密码怎么办 宽带连接用户名和密码忘了怎么办 江西银行网银用户名忘记了怎么办 江西银行网银密码忘了怎么办 广发信用卡网银密码忘了怎么办 刚注册的淘宝账号买不了东西怎么办 隐藏后的wif不知道用户名怎么办 脊柱侧弯术后钢钉断了一根怎么办 对法院执行裁定申请复议过期怎么办 自己家店名被别人注册了商标怎么办 有人去工商局投诉我公司了怎么办 急用钱怎么办啊有没有什么贷款啊 初级会计报名信息表没打印怎么办 电工证复审流程时间过了怎么办 应版权方要求无法下载的电影怎么办 手机设置蜜码小孩都能破解该怎么办 拍到了上海车牌不想买车了怎么办 买车4s店不给临时车牌怎么办 百度云谣绑定的邮箱被绑定了怎么办 百度网盘分享的视频打不开怎么办 在赶集网登录时忘记验证码该怎么办 支付宝绑定的手机号是空号了怎么办 微信聊天后电话号码重复是怎么办 老婆在外省工作不回到我身边怎么办 知道扣扣号怎样盗取他的密码怎么办 喜欢养猫又怕猫破坏家里怎么办