1. 作用域与闭包

作用域

变量可以起作用的范围和区域
JavaScript分全局作用域、函数作用域、块作用域。

  • 全局作用域

    默认,在任何地方都可以访问

    1. let name = '张三';
    2. console.log(name);
  • 函数作用域

    只可以在函数内部访问
    函数作用域

    1. function user() {
    2. let name = '李四';
    3. return name;
    4. }
    5. // 从全局无法获得
    6. console.log(name);
    7. // 需要使用函数调用
    8. console.log(user());
  • 块作用域

    在块内被访问被{}包裹的就是块。如if(){} while{}等
    var不支持块作用域,需要用let
    块作用域

    1. if (true) {
    2. let name = '张三';
    3. console.log(name);
    4. }
    5. // 外部无法访问到块内
    6. console.log(name);
  • 作用域链

    作用域可以根据代码层次分层,以便子作用域可以访问父作用域,通常是沿着链式的方式查找,先查找当前的作用域,当前没有,就向上找到父级的作用域,如果在父级的作用域中也找不到,就继续向上查找,直到window的作用域。如果在window中也找不到,就报错了
    作用域链

    1. let a = 10;
    2. function first() {
    3. let b = 20;
    4. function second() {
    5. let c = 30;
    6. function three() {
    7. let d = 40;
    8. console.log('a:%d,b:%d,c:%d,d:%d', a, b, c, d);
    9. }
    10. three();
    11. }
    12. second();
    13. }
    14. first();

闭包

一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。
闭包

  1. function user() {
  2. let name = '张三';
  3. function getName() {
  4. return name;
  5. }
  6. return getName;
  7. }
  8. let u = user();
  9. console.log(u());

2. 类与类的继承

类是用于创建对象的模板。

  • 类的定义

    使用带有class关键字声明,类名首字母大写
    类声明不会提升。你首先需要声明你的类,然后再使用它

    1. class User {
    2. constructor(name,email) {
    3. this.name = name;
    4. this.email = email;
    5. }
    6. }

    类表达式是定义类的另一种方法

    1. let User = class {
    2. constructor(name, email) {
    3. this.name = name;
    4. this.email = email;
    5. }
    6. }
  • 类体和方法定义

    一个类的类体是一对花括号/大括号 {} 中的部分。这是你定义类成员的位置,如构造函数,静态方法,原型方法,getter和setter等。
    类体

    1. class User {
    2. // 构造方法:constructor
    3. constructor(name,email) {
    4. this.name = name;
    5. this.email = email;
    6. }
    7. // 静态属性:static
    8. static country = 'CN';
    9. // 私有属性,不能被子类继承:#
    10. #age = 25;
    11. // 原型方法
    12. show() {
    13. return {name:this.name,email:this.email};
    14. }
    15. // 静态方法,不需要(new)实例化,直接用类名调用:static
    16. static getCountry() {
    17. // 静态成员中的this表示的是当前类
    18. return this.country;
    19. }
    20. }
    21. // 类的实例化
    22. let user = new User('张三','tp@qq.com');
    23. console.dir(user);
    24. console.dir(User);

    类的静态属性与方法

    1. // 获取类的静态属性
    2. console.log(User.country);
    3. // 调用类的静态方法
    4. console.log(User.getCountry());
  • 类的继承

    使用extends 关键字在 类声明 或 类表达式 中用于创建一个类作为另一个类的一个子类
    声明子类

    1. class User {
    2. }
    3. class Phper extends User {
    4. }
    5. console.dir(Phper);

    如果子类中定义了构造函数,那么它必须先调用 super() 才能使用 this
    super

    1. // 父类
    2. class User {
    3. constructor(name, email) {
    4. this.name = name;
    5. this.email = email;
    6. }
    7. show() {
    8. return {name:this.name,email:this.email};
    9. }
    10. }
    11. // 子类
    12. class Phper extends User {
    13. constructor(name,email,gender) {
    14. super(name,email);
    15. this.gender = gender;
    16. }
    17. // 重写父类的方法
    18. show() {
    19. return {name:this.name,email:this.email,gender:this.gender};
    20. }
    21. }
    22. let u = new Phper('张三','tp@php.cn','男');
    23. console.dir(u);
    24. console.log(u.show());

更多相关文章

  1. int|char数组在sizeof和strlen函数中的应用以及指针的应用
  2. 《从0到1学习Flink》—— Flink Data transformation(转换)
  3. [JS基础入门] 变量、常量及函数的语法与使用方式
  4. 【JS基础入门】JavaScript基础之值与引用传递、模板字面量、解构
  5. 立即执行函数 箭头函数等
  6. 嵌套函数和作用域和匿名函数
  7. 函数装饰器
  8. js第一课 引入方式 参数 函数
  9. Python数据分析相关面试题!Python学习教程

随机推荐

  1. Android(安卓)使用 AIDL 实现进程间通信,
  2. Android漫游记(1)---内存映射镜像(memory
  3. Android(安卓)Dialog 全屏
  4. Android基本框架笔记
  5. Android 开发简介-系统架构
  6. android使用文件进行存储
  7. Android 面试题总结之Android 进阶(二)
  8. Android当中的MVP模式(三)基于分页列表的封
  9. Android创始人安迪 罗宾(Andy Rubin)离职
  10. Android(安卓): 自己写个HTTP框架