###用var 创建的变量也会给全局对象GO加对应的属性
### 创建函数 和 创建 变量 最好: let a = 123; 表达式形式: let fn = function(){}(目的:避免变量提升,不符合正常逻辑,正常逻辑:初始化之后使用。否则恶心至极!!!)
var 与 let 区别:
1.是否变量提升(var 提升,let 不提升)
2.全局变量对象中声明的变量(用var声明)也会给全局对象GO中增加一个对应的属性(var a = 12 ; console.log(window.x) //12;但是let a =12; console.log(window.x)//undefined),但是用let 声明的变量,则不存在这个特点。======》仅限于全局有创建全局变量给全局属性这个特点,私有的执行上下文中就是私有变量。
###注意:
编译阶段(编译器)
=》词法解析 = 》AST抽象语法树(给浏览器引擎去运行的)
引擎执行阶段
=》ECStack=>EC(G) =>VO(G)、GO(G)。。。
3.带var的可以重复声明(此法解析阶段可以审核过),执行阶段遇到已经声明过,不会再重新声明。但是let是不可以,词法解析阶段都过不去,也就不存在引擎去执行代码阶段了。(总结:可以说var并不严谨,所以在es6阶段,词法解析器会提前做一些规则处理eg:是否重复声明!!)
4.let存在块级作用域,var没有;除了对象的{},其他都可以理解为跨级作用域;eg:循环、判断、try..catch、swith、
5. typeof a (这里会提示:undefined)这是JS的暂时性死区(暂时没解决的bug)
let 与 const 区别(let创建的变量可以更改指针指向的(也就是可以重新赋值),但是const声明的变量不允许更改指针指向)
let x = 100 ; x=200
const y=100; y=200; =>
***惰性函数 柯里化函数 单例模式
compose函数