美文网首页饥人谷技术博客
分享一篇有关变量声明提升机制的博文

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

作者: 饥人谷_鸡冷 | 来源:发表于2015-11-21 20:50 被阅读0次

从一本有趣的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,欢迎大家一起指正讨论学习进步,谢谢大家

相关文章

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

    从一本有趣的js书说起 最近在逛某当搜索javascript的时候发现一本相当有趣的介绍js各种设计模式的教学书籍...

  • 《深入理解ES6》读书笔记——1.块级作用域绑定

    1)var声明及变量提升机制 1.概念 提升机制:在函数作用域或全局作用域中,通过var声明的变量,无论实际在哪里...

  • ES6

    1.变量声明let和const 预解析机制 : var有变量提升的机制 把声明赋值和打印的语句顺序交换 ES5的解...

  • ES6学习-块级作用域绑定

    var声明及变量提升(Hoisting)机制 在函数作用域通过var声明的变量,无论在哪里声明都会被当成作用域顶部...

  • var与let对作用域的影响

    var与let区别: var可以声明全局变量与局部变量,并且具有变量提升机制; let声明块级变量,同时也是为了解...

  • JS 函数声明和函数表达式的区别

    函数声明和函数表达式的区别优先级JavaScript的变量声明提升机制-即可以先使用,后声明函数声明会被提升到作用...

  • 深入理解ES6-块级作用域绑定

    var声明及变量提升(Hoisting)机制 在函数作用域或全局作用域钟通过关键字var声明的变量,都会被当成在当...

  • 块级作用域绑定

    var声明及变量提升(Hoisting)机制 在函数作用域或全局作用域中通过关键字var声明的变量,无论实际上是在...

  • 变量声明 var、let、const

    1. var变量声明提升 var声明的变量,发生变量声明提升;即:变量的声明被提升到该作用域的顶部 let 和 c...

  • 浅析关于 JS 作用域的几个高频知识点

    闭包 词法作用域 变量提升 变量提升 什么是变量提升 顾名思义,变量提升指的是,在声明变量的时候,变量的声明位置会...

网友评论

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

    本文链接:https://www.haomeiwen.com/subject/aizlhttx.html