js语言的两个核心技术-----------异步和闭包javascript
Question1:那么什么是闭包呢? 通俗的说法就是外层函数包裹内层函数,内层函数能够调用外层函数的变量.............java
(这种解释怎么都感受有种自欺欺人的样子,看来仍是须要进一步了解它的前世此生才能说,我理解撒是闭包)性能优化
----------------------------------------------------------------闭包
俗话说得好,他山之石能够攻玉,有几本书是如此来介绍闭包的:异步
NO1:闭包是指有权访问另外一个函数做用域中的变量的函数(这个比较通俗易理解)函数
NO2:函数对象能够经过做用域关联起来,函数体内的变量均可以保存在函数做用域中,这在计算机科学文献中称为'闭包',全部的javascript函数都是闭包性能
NO3:闭包是基于语法做用域书写代码时所产生的必然结果(提及来有点玄乎)优化
NO4:函数能够经过做用域链关联起来,函数内部的变量能够保存在其它函数做用域内,这种特性在计算机科学文献中称为闭包spa
----------------------------------------------------------------code
咱们从语法做用域到做用域链的概念再到闭包的造成过程来梳理一下'闭包'
语法做用域
要理解语法做用域,咱们先来解释JS的编译阶段,it goes without saying that JS is the weakly typed language, 所谓的弱类型是指不用预约义变量的存储类型,不过这个弱类型不能彻底归纳JS和其它语言的区别,咱们这里再来引出-----'编译语言'(comes from<<你不知道的javascript>>)
编译语言
编译语言在执行以前要经历三个阶段,这三个阶段就像过滤器同样,将咱们写的代码转换成语言内部特定的可执行代码,好比咱们写的代码是var a=1;而JS引擎内部定义的格式是 var,a,=,1 那在编译阶段 就须要把他们进行转换.这只是一个比喻,而事实上这只是在编译阶段的第一个阶段所作的事下面分析三个阶段作了什么.
1.分词/语法分析(Tokenizing/Lexing)
其实咱们写的代码就是字符串,在编译的第一个阶段,把这些字符串转换成 语法单元(toekn), 语法单元咱们能够想象成咱们上面分解的表达式那样.(注意这个不步骤可能有两种可能,当前这属于 分词,而 语法分析, 会在下面和语法做用域一块儿说.)
2.解析/语法分析(Parsing)
在有了语法单词以后,JS还须要继续分析代码中的语法以便JS引擎减少负担(总不能在引擎运行的过程当中让它承受这么多轮的转换规则吧?),经过语法单元生成了一个 抽象语法树,(abstract syntax tree),它的做用是为JS引擎构造出一份程序语法树,咱们简称为AST,这时咱们不由联想到DOM 树,他们都是树,以 var,a,=,1为例,它会以层为单元划分他们,例如:顶层有一个stepA里面包含着'v',stepA下面有一个stepB,stepB中包含有'a',就这样一层一层嵌套下去...
3.代码生成(raw code)
这个阶段主要作的就是拿AST来生成一份JS语言内部承认的 代码(这时语言内部制定的,并非二进制),在生成的过程当中,编译器还会询问做用域的问题,仍是以var a=1为例,编译器首先会询问做用域,当前有没有变量a,若是有则忽略,不然在当前做用域下建立一个叫作a的变量
语法阶段
上面归纳的只是全部编译语言最基本的流程,对于咱们的JS而言,它在编译阶段作的事情不单单是那些,它会提早为js引擎作一些性能优化等工做,总之,编译器干的事情超乎你的想象.
语法做用域是发生在编译阶段的第一个步骤当中,也就是分词/词法分析阶段.它有两种可能,分词和语法分析,分词是无状态的,而语法分析是有状态的.
---------------未完待续.....