一.闭包
函数的嵌套定义, 定义在内部的函数就称之为 闭包
1.一个函数要使用另一个函数的局部变量
2.闭包会持久化包裹自身的函数的局部变量
3.解决循环绑定
function outer() {
var num = 10;
function inner() { // 闭包
// 1.在inner函数中,使用了outer的局部变量num
return num;
}
return inner;
}
var innerFn = outer();
// 2.借助闭包,将局部变量num的生命周期提升了
var num = innerFn();
console.log(num);
二.变量提升
1.在变量声明之前 去使用变量 会得到 undefined ,而不是报错.
2.函数内,如果声明了跟全局变量同名的局部变量, 在声明之前使用该变量,得到undefined( 该变量已经是局部的啦)
三.JS原型和原型链
1.原型
每个对象 都有原型 (原型仍然是一个对象)
对象可以继承原型的属性和方法
__proto__
所有对象都有该属性, 该属性指向该对象的原型
2.原型链
原型作为对象 也有原型
原型的原型的原型 就构成了 原型链
使用对象中某个属性的时候,先从对象中找,如果没有,从原型上找,原型如果也没有,继续向上找,知道顶层 (顶层的原型对象是一个 类型(类)(构造 函数)是Object 的对象)
四.面向对象js
1.json方式定义对象
var obj = {
// 属性
name: 'Zero',
// 方法
teach: function () {
console.log("教学");
}
};
obj.name | obj.teach()
2.构造函数
function Person(name) { // 类似于python中的类一样来使用
// this代表Person构造函数实例化出的所有具体对象中的某一个
this.name = name;
this.teach = function () {
console.log(this.name + "正在教学");
}
}
// ①通过构造函数实例化出具体对象
// ②通过对象.语法调用属性与方法
var p1 = new Person("张三");
p1.name // 张三, this指向p1对象
var p2 = new Person("李四");
p2.teach // 李四正在教学, this指向p2对象
// 3.ES6类语法
class Student {
// 需要构造器(构造函数)来完成对象的声明与初始化
constructor (name) {
// 属性在构造器中声明并完成初始化
this.name = name;
}
// 类中规定普通方法
study () {
console.log(this.name + "正在学习");
}
// 类方法
static fn() {
console.log("我是类方法")
}
}
// 类中的普通方法由类的具体实例化对象来调用
// 类中的类方法由类直接来调用(这类型的方法大多是功能性方法,不需要对象的存在)