JavaScript

作用域(scope)

  1. 全局作用域

    变量在函数或代码块{}外定义

  2. 局部作用域

    变量在函数内部定义的

  3. 块级作用域

    {}

  4. 动态作用域

    JS采用静态作用域:变量的作用域是在定义时决定的而不是执行时决定的。

    动态作用域:只能在执行阶段才能决定变量的作用域

作用域:就是变量的使用范围。js中作用域分为全局和局部

js的作用域链分为全局作用域和局部作用域。在全局作用域中是不能访问局部作用域中的数据。在局部作用域中访问变量如果当前作用域中有可以直接访问,如果没有那么向上级作用域中访问,如果上级作用域也没有就继续向上找,知道找到全局window作用域,如果window作用域也没有返回undefined,整个作用域的访问形成了一个作用域链

this对象的理解

  • 在ES5中,如果想要知道this指向谁,就要看当前的这个函数是在哪里调用的

    • 在事件中调用,this就是当前触发事件的元素

    • 在对象中调用,this就是当前对象

    • 在全局调用,this就是window

    • 在面向对象中,this就是当前用new关键字创建出来的对象

  • 在ES6的箭头函数中,要看定义这个箭头函数的父级作用域是谁,this就是谁

  • 如果用call、apply、bind调用函数,这三个函数的第一个参数就是this指向

this的本质

  • 全局函数的 this 指向全局对象 window。

  • 当函数作为对象的方法被调用时,this 指向该对象。即谁调用函数 this 就指向谁。

  • 构造函数的 this 指向实例化的对象。

  • 匿名函数的 this 指向全局对象 window。

  • 箭头函数的 this 指向的是定义时的 this 对象,而不是执行时的 this 对象。箭头函数没有 this。

ES5 中的类与继承

流行的面向对象编写方式:构造函数 + 原型的混合方式来模拟一个类。

  1. 构造函数

构造函数本质上就一个函数,通过构造函数负责添加属性。

  1. 原型

原型 prototype,通过原型负责添加方法。

ES6 中的类与继承

ES6 中的 class 其实本质上是在构造函数和原型的混合方式的基础上做的进一步封装。

  1. class:定义类

  2. constructor:构造方法,用来初始化的,也是唯一的。

  3. 继承:class 子类 extends 父类 {……}

  4. 使用 super 时需要注意的地方:

    1. 子类必须在 constructor 方法中调用 super 方法;

    2. 必须先调用 super 方法,才可以使用 this ,否则报错!

原型与原型链

  1. 什么是原型?

    在已有对象中加入自己的属性和方法。

    (1)原型

    proto:每个对象都有一个内部属性 proto ,指向该对象的原型。prototype:在构造函数中有一个 prototype 属性,是构造函数才有的属性,也叫原型,包含所有实例共享的属性和方法,当创建实例时,该 prototype 就会作为实例对象的原型 proto 。

    (2)原型链

    对象使用属性和方法时,首先会在当前 proto 中寻找,找不到就会去自己原型 proto 关联的 prototype 上寻找,找不到继续去 prototype 的proto 关联的 prototype 上寻找,直到找到或报 undefined 。

  2. 为什么用原型?

    例子:为 Array 添加 sum 求和方法。

    • 给对象添加方法

    • 给原型添加方法

继承

  1. 什么是继承?

    • 在原有类(父类)的基础上,略做修改,得到一个新的派生类(子类)

    • 同时不能影响原有类(父类)的功能

  2. 如何继承?

    • 继承构造函数

      • 父类.call(this)——让父类内部的this指向子类的对象

如何继承?

  • 继承构造函数

    • 父类.call(this)——让父类内部的this指向子类的对象

继承原型

  • 不能直接赋值:子类.prototype = 父类.prototype

    因为这是引用赋值,prototype 本质上也是一个对象

  • 应该使用for in 遍历父类原型实现继承原型

原型:每一个对象都有一个prototype属性可以挂载要扩展的属性和方法,在prototype上挂载的属性和方法在这个对象的任何实例上都可以调用。

Js是单线程

所谓单线程是指一次只能完成一个任务。如果有多个任务,就必须排队等候,只有等前面的一个任务完成,才能继续后面的一个任务。单线程只要其中有一个任务耗时长,后面的任务都必须排队等着。为了解决这个问题,JS将任务的执行模式分成两种:同步和异步。

同步与异步

先弄清楚一件事情:编程中的同步异步和现实生活中的同步异步正好相反。

  • 同步:连续不间断地执行多个任务,会阻塞主线程。比如console.log()、alert()

  • 异步:不连续地执行多个任务,不会阻塞主线程。比如 setTimeout()、网络请求、读取本地文件等

console.log(1)
setTimeout(() => {
    console.log(2)
}, 1000)
console.log(3)
​
// 1 3 2

异步编程解决方案

1. 回调函数

  1. 什么是回调函数?

    回调函数就是一个被作为参数传递的函数。通俗的说,回调函数是一个函数,并且是一个作为参数传递给另一个函数的函数。

  2. 回调函数的基本用法

    案例1:

你可能感兴趣的:(javascript,前端,开发语言,es6)