Blogger Information
Blog 18
fans 1
comment 0
visits 12277
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
js 中的作用域与闭包,类与继承 ---- 0402
木樨
Original
524 people have browsed it

一、作用域与闭包

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());
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