读你不知道的js


title: 读你不知道的javascript
date: 2018-03-21 19:25:13

tags:你不知道的javascript

今天重读《你不知道的javascript》这本书,真是受益良多。在此记录一下。

  • 作用域:作用域就是用来查找变量的一个规则。RHS, LHS 变量引用(右查找)和变量查找(左查找)
    变量引用 即是从右向左开始查找 赋值操作的源头,如果没有找到,则会报;变量查找即是从左向右查找,赋值操作的目标,如果当前作用域没有找到,外层作用域也没找到,所有作用域都没找到,则全局作用域中就会创建一个此名称的变量(在严格模式下不可以创建的~)
  • 词法作用域 词法作用域定义在词法阶段的作用域 即在写代码时变量和作用域写在哪里 。不管函数在哪里被调用,如何被调用,它的词法作用域只由函数声明时所处位置决定。
  • 函数作用域 属于这个函数的作用域的全部变量都可以在整个函数的范围内使用及复用。可以通过在函数中 声明函数来隐藏内部实现(闭包就是这样的,函数内部 隐藏了变量和函数)函数声明和函数表达式之间最重要的区别就是它们的名称标识符将绑定在何处
  • 块作用域 只在块中起作用的变量 try/catch函数,ES6中的let,完美解决了块作用域
  • 提升 (先有鸡还是先有蛋的问题) 声明(蛋) 赋值(鸡) 到底谁在前?? 包括变量和函数在内的所有声明都会在任何代码执行前被处理,也就是说,现有(蛋)本来按照正常流程时这样处理histing1
    其实实际是这样处理的 histing2这个过程好像变量和函数声明从它们在代码中出现的位置被“移动”到了最上面,这个过程就是提升。 但是函数声明和变量虽然都会被提升,但是函数提升会在变量提升的前面。如下所示,foo()输出为1,因为foo()的提升,而且会覆盖重复声明:histing3
    histing4
  • 闭包 理解闭包首先要了解的是变量提升,作用域的概念。闭包即是函数中变量的隐藏,把引用内部变量的函数当作函数返回。在平时的工作过程中其实已经不经意间使用了很多闭包了,例如setTimeInterval()函数,还有就是jQuery中的函数对事件的响应。这次再读你不知道的js 结合ES6,对闭包有了进一步的了解,困惑了很久的问题终于在今天得以解决。