博客列表 >js 中的作用域与闭包,类与继承 ---- 0402

js 中的作用域与闭包,类与继承 ---- 0402

木樨
木樨原创
2021年04月05日 22:03:02525浏览

一、作用域与闭包

1.作用域

1.全局作用域
(1) 全局作用域在页面打开时被创建,页面关闭时被销毁
(2) 写在 script 标签中的变量和函数,作用域为全局,在页面的任意位置都可以访问到
(3) 在全局作用域中有全局对象 window,代表一个浏览器窗口,由浏览器创建,可以直接调用
(4) 全局作用域中声明的变量和函数会作为 window 对象的属性和方法保存

  1. ver name = 'php中文网';
  2. console.log(name);
  3. console.log(window.name);

2.函数作用域
(1) 调用函数时,函数作用域被创建,函数执行完毕,函数作用域被销毁
(2) 每调用一次函数就会创建一个新的函数作用域,他们之间是相互独立的
(3) 在函数作用域中可以访问到全局作用域的变量,在函数外无法访问到函数作用域内的变量
(4) 在函数作用域中访问变量、函数时,会先在自身作用域中寻找,若没有找到,则会到函数的上一级作用域中寻找,一直到全局作用域
(5) 在函数作用域中也有声明提前的特性,对于变量和函数都起作用,此时函数作用域相当于一个小的全局作用域
(6) 在函数作用域中,不使用变量关键字声明的变量,在赋值时会往上一级作用域寻找已经声明的同名变量,直到全局作用域时还没找到,则会成为 window 的属性
(7) 在函数中定义形参,等同于声明变量

  1. let site = 'php中文网';
  2. function getSite() {
  3. // 在函数内部可以访问到外部的全局变量
  4. // 私有成员,仅限在当前作用内访问, 外部不可见
  5. let domain = 'php.cn';
  6. return `${site} [ ${domain} ]`;
  7. }
  8. console.log(getSite());

3.块作用域
(1)用{}创建快作用域
(2) let, const 支持块作用域; var 不支持块作用域

  1. {
  2. let a = 1;
  3. const B = 'hello';
  4. }
  5. console.log(a, B);

2.闭包:能够访问自由变量的函数;理论上讲,所有函数都是闭包

  1. let c = 100;
  2. function sum(a, b) {
  3. // 自由变量,函数参数以外的变量;c 为自由变量
  4. return a + b + c;
  5. }
  6. console.log(sum(4, 5));
  7. // 通过闭包来访问内部的私有变量;
  8. function demo1() {
  9. // 私有变量
  10. let email = 'a@qq.com';
  11. return function d() {
  12. // 对于这个子函数来说,email就是它的自由变量
  13. return email;
  14. };
  15. }
  16. console.log(demo1()());

二、类与类的继承

1.类: 使用 class 关键字实现类

  1. class User1 {
  2. // 构造方法:初始化对象的
  3. constructor(name, email) {
  4. this.name = name;
  5. this.email = email;
  6. }
  7. // 原型方法(共享方法),通过对象来调用的
  8. show() {
  9. return { name: this.name, email: this.email, age: this.#age };
  10. }
  11. // 静态方法: 不需要实例化(new class),直接用类来调用
  12. static fetch() {
  13. // 静态成员中的this表示的就是当前的类
  14. return this.userName;
  15. }
  16. // 静态属性/变量
  17. static userName = '灭绝小师妹';
  18. // 私有成员
  19. #age = 50;
  20. // 还可以声明访问器属性: 伪装成属性的方法,有get,set
  21. // 使用访问器属性来访问私有成员
  22. get age() {
  23. return this.#age;
  24. }
  25. set age(value) {
  26. if (value >= 18 && value < 60) this.#age = value;
  27. else console.log('年龄非法');
  28. }
  29. }
  30. const user1 = new User1('天蓬老师', 'tp@qq.com');
  31. console.log(user1.show());
  32. // 静态方法直接用类调用
  33. console.log(User1.fetch());
  34. console.log('my age = ', user1.age);
  35. user1.age = 160;
  36. console.log('my age = ', user1.age);
  37. user1.age = 32;
  38. console.log('my age = ', user1.age);

2.继承:使用 extends 关键字实现继承

  1. // 继承,通常是对父类进行一些扩展(添加一些新的属性或方法)
  2. class Child extends User1 {
  3. constructor(name, email, gender) {
  4. // 第一步必须将父类的构造方法来执行一下,否则this用不了
  5. super(name, email);
  6. // 第二步给子类的新成中去初始化
  7. this.gender = gender;
  8. }
  9. // 父类的原型方法
  10. show() {
  11. return { name: this.name, email: this.email, gender: this.gender };
  12. }
  13. }
  14. const child = new Child('欧阳老师', 'oy@qq.com', '男');
  15. console.log(child.show());
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议