Blogger Information
Blog 34
fans 0
comment 0
visits 18335
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
0402作业-作用域与闭包、类与类的继承
千山暮雪
Original
386 people have browsed it

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());
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post