从一本有趣的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,因此!a为true,if语句才得以执行,如果将if(!a)改成if(a)则alert(a)将会为undefined。
var a = 1;
function foo(){
if(a){
var a = 2;
}
alert(a);
}
foo();//undefined
因为真的编辑了很长时间,写得我都有点头昏脑涨了,逻辑有点混乱了,而且实际上并没有多少内容,希望大家仔细研究一下原文Scoping & Hosting,欢迎大家一起指正讨论学习进步,谢谢大家