这是Udemy上的一个课Understanding the Weird Parts,想的是学习学习js能力,同时好像听说这课很好!
1 Js里面Hoisting(变量提升)
1.1 Hoisting 是什么? 简单来说就是变量提升,就是把定义的变项放到最前面开始执行,var a和function b(){...},这就是宣告declare 1.2 定义变项时可以分为可以分成宣告(declaration)和给值(initialization)的两个过程,宣告在逐行执行程序之前,给值在hoisted之后
2 js undefined不是真的undefined !!
2.1 undefined也是一个值
结果是:
2.2 如果直接给初始化为undefined
结果为:
又变成了undefined了
lg:undefined 在宣告以后但是没有给值,not defined是该变项没有被宣告过,执行就会出现错误!
3 js 不同的execution context(执行上下文)的变项不会互相影响-了解function背后运作的逻辑
3.1 先建立global execution context(全局执行上下文),function a和b先建立在内存里面,如何开始逐行执行程序,执行到a的时候,在执行栈a然后是b,b执行完就离开,然后是a
lg:局域变量之间不影响,但是要是找不到该变量的值(局域里),就会往外继续找
4 js Scope Chain(作用域链) 和outer enviroment(外部环境)
lg:
5 异步(asynchronous)和事件队列(event queue)
5.1 synchronous指的是one at a time,也就是程序会逐列执行,一次执行一列; asynchronous多了一个a,指的就是more than one at a time,也就是程序在执行的时候会同时执行不只一列的代码。
5.2 如何执行异步事件 在JavaScript执行asynchronous callback的过程是这样的,它会先把所有的execution context的内容执行完毕后,才去执行“event queue”,event queue里面就包含像是鼠标点击或是http request的内容。 lg:就是把execution context的内容执行完毕,然后去执行event queue的内容
6 运算符的优先级(Precedence)和结合性(Associativity)
lg:
7 类型转换(coercion)
数字转化为字符可以简单的 var a = 1 ; a = a+""; 这样就可以了
利用coercion的特性可以创建默认值
lg:name= name||''