一、学习内容:
闭包
1. 闭包是一种跨作用域访问变量,形成闭包,闭包是一种作用域的体现
2. 常见的闭包写法是:父函数嵌套子函数,子函数可以访问父函数的变量,把子函数返回或者挂载到window上
作用
实现了早期的模块化开发,把所有的变量隐藏在内部,对外暴露统一的范围接口
作用:隐藏变量,避免全局污染(ES6自带模块化开发)
优缺点
优点:隐藏了变量,避免了全局污染,实现了早期的模块化开发、
缺点:一旦形成了闭包,这个变量不会被内存释放,内存开销比较大,会造成内存泄漏,所以不建议过多的使用闭包
闭包的标准写法
let r = (function () {
let money = 500;
function spendMoney() {
console.log('money',money);
money -= 100;
return money;
}
return spendMoney;
})();
console.log(r()); // 400
console.log(r()); // 300
console.log(r()); // 200
// 每调用一次就会执行一次函数
; (function () {
let money = 500;
function spendMoney() {
console.log('money', money);
money -= 100;
return money;
}
window.$bibao = {
// spendMoney:spendMoney,
spendMoney // 简写
}
})();
console.log(window.$bibao);
console.log(window.$bibao.spendMoney);
console.log(window.$bibao.spendMoney());
面向对象思想
面向过程pop
按照流程步骤,一步一步的走,实现功能,每一步都是亲力亲为
优点:对流程细节把控比较清晰
缺点:不适合大型的项目
面向对象oop
从全局出发,把功能都封装到对象中然后要做什么就找什么对象,调用对象的方法
优点:适合大型项目,功能都封装在各个对象中
缺点:对细节把控不清晰
类和构造函数的关系
1. 概念:构造函数在js中,可以称为类
2. js内置的构造函数有:Array、String、Number、Function、Object、Date、Boolean、Error、RegExp....
3. 他们的作用:造出各种各样的数据。造:new出来,实例化出来。new出各种实例对象,得到各种类型的数据
4. 如果js内置没有这个构造函数,自己怎么样发明一个?如何自己写出一个构造函数
实例对象:具体的一个对象
// arr实例对象
// Array构造函数
const arr = new Array();
// 字面量就是一种语法糖:真正执行的过程就是new的过程,所有的数组都是底层new出来的
const arr1 = [];
const o1 = new Object();
const o2 = {};
const n1 = new Number();
// 这个过程是基本数据类型:赋值是通过valueOf
const n2 = 111;
// console.log(arr);
// console.log(arr1);
// 类===构造函数:在ES5中相等
// 构造函数
// str.constructor === String;
// a.constructor === Boolean;
// fn.constructor === Function;
// 是构造函数,不是对象,是js的内置函数,内置的类都是大写开头的
// constructor--->构造函数
// 不是所有的对象都是类---undefined、null
自定义构造函数的特点
构造函数
// 构造函数
function Person(name, age) {
this.name = name;
this.age = age;
this.skill = function () {
return '333'
}
// console.log('this', this);
// this指向p1---实例对象
}
实例对象
// 实例对象
let p1 = new Person('kl', 23);
let p2 = new Person('kl', 213);
// console.log('p1', p1);
// console.log(p1.name);
特点
1.构造函数首字母大写
2.属性和方法都是挂载在this上
3.this指向实例对象
4.没有返回值
5.使用new进行调用
new的过程发生了什么?
1. 首先会创建一个空对象
2. this指向这个实例对象
3. 指向这个构造函数的倒霉---这里边的代码都走一遍
4. 自动返回一个this(this指向实例对象)
|