分享一篇有关变量声明提升机制的博文

从一本有趣的js书说起

最近在逛某当搜索javascript的时候发现一本相当有趣的介绍js各种设计模式的教学书籍javascript设计模式(张容铭 著)这里给大家安利一下


当时看到推荐语里面的介绍说这本书是通过讲述一个菜鸟程序员是如何在职场实践中成长的就立马勾起了我的兴趣,特别是之后看到目录里那一个个基本没见过感觉上又很高大上的模式的词汇更让我下定决心要买这本书。
经过数天的苦等,这本勾起我强烈学习欲望的课本昨天终于到手了,恰逢今天是一星期一度的周末,刚好有很多时间可以休息和学习,于是今天就翻看了一下这本书。首先第一章介绍了本书的主人公入职第一天参与项目任务时创建一大堆全局变量然后被教育了一整天的故事,接着第二章小白一大早就又被项目经理教训了一番,然后委屈的小白去向第二主人公小铭求教,小铭给小白讲了一大堆面向对象编程的思想和方法,但是看到静态私有变量这个概念时我就懵了,我本科专业不是编程方向,虽然因为课程需要学过一点C语言和汇编,但对这个词汇并没有印象和概念(C语言没学好),然后就引发了我今天一连串蝴蝶效应的搜索

  • 静态变量
  • 静态私有变量
  • 立即执行函数
  • Javascript函数声明提升

在查找学习立即执行函数相关知识通过一条外链让我看到了一篇有关变量声明提升和变量作用域Scoping & Hosting的博文,博文中举的第一个例子的“怪异”表现引起了我的注意

    var a = 1;
    function foo() { 
    if (!a) {
       var a = 2; } 
    alert(a);};
    foo();//2}

先说一下函数声明提升吧

第一次接触函数声明提升是在

Javascript高级程序设计(第三版) 5.5.2 实际上,解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁。解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);第七章 函数表达式 关于函数声明,他的一个重要特征就是函数声明提升(function declaration hoisting),意思是在执行代码之前会先读取函数声明。

中接触到的,但是当时只是知道函数声明有函数声明提升(函数在加载时会率先读取函数声明)这个特性,并不知道变量声明提升这个概念,也并不清楚javascript解析器的这个机制。

回到alert(a);//2

本来很想分享一下我对js解析器对函数和变量声明提升这一机制的一些理解,但是发现自己编辑了差不多两个小时也还没进入主题,今天就先不分享了,这里就简答的指出一下原博的一个错误

原博错误处

文中说

而无论 if语句的条件如何,都将为新的变量 a 赋值为 2

而实际上并不是这样,应该是在函数内部声明了变量a,而JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面,即相当于在当前函数作用域的最前端声明了一个变量a而没有给a赋值,此时a的数据类型应该为undefined,所以在做if判断时a转换成的布尔值应该为false,因此!atrue,if语句才得以执行,如果将if(!a)改成if(a)则alert(a)将会为undefined。

      var a = 1;
      function foo(){
        if(a){
          var a = 2;
         }
        alert(a);
      }
      foo();//undefined

因为真的编辑了很长时间,写得我都有点头昏脑涨了,逻辑有点混乱了,而且实际上并没有多少内容,希望大家仔细研究一下原文Scoping & Hosting,欢迎大家一起指正讨论学习进步,谢谢大家

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容