JavaScript基础篇(五)

83 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

闭包

什么是闭包?

一个函数在定义时的词法作用域之外被调用,它依然能访问到定义时的词法作用域。

闭包的作用?

  1. 私有化变量
  2. 将变量保存在内存中,不被垃圾回收
  3. 避免全局变量的污染

this指向

this指向一个对象,this的指向完全取决于函数调用的位置;

绑定规则

  • 默认绑定规则(window)
function test() {
   console.log(this===window);  //true
}
test();
  • 隐式绑定规则—谁调用指向谁
// 指向 obj,但有时会出现隐式丢失
let obj = {
      name: 'obj',
      foo: function () {
        console.log(this);   //this指向obj
      }
    }
obj.foo()
  • 显示绑定规则

    通过bind、call、apply指定this,this是第一个参数

  • new 绑定

    this指向函数实例化之后的对象

绑定规则优先级

new绑定 > 显式绑定 > 隐式绑定 > 默认绑定

箭头函数

箭头函数使this从“动态”变成“静态”,实质是内部没有this指向,继承上级对象this,指向箭头函数的this指向定义时外部作用域内的this指向。箭头函数会捕获其所在上下文的 this 值,作为自己的 this

注意:

  1. 箭头函数不能被实例化,也就是不会被new
  2. call、apply不能改变箭头函数的this

异步编程

JavaScript是一门单线程语言,一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成再执行后面一个任务。

在JavaScript中大多数代码都是同步执行的,但坏处就是如果一段代码很耗时的话,就会阻塞程序,页面卡死,这个时候就需要异步来解决了。异步代码不是立即执行,而是需要等待,在未来的某一个时间点执行。

同步代码异步代码
<script>代码网络请求(Ajax)
I/O 操作定时器(setTimeout、setInterval)
渲染操作Promise(then)
async/await

最常见的就是我们发送请求,在拿到请求数据后做一些操作,数据请求时间长的话会阻塞代码执行,这个时候就用到了异步,待数据返回后在执行。

解决方案:

  1. callback方式

    缺点:容易产生回调地狱,难以理解

  2. promise方式

  3. Generator方式

  4. async/await方式

事件循环Event Loop