---
... 2025-7-10 大约 4 分钟
# 变量作用域
- 全局变量 在任何地方都能访问 并且 持久保存
- 局部变量 只能在当前作用域访问 在函数执行结束后 局部变量会被 浏览器 回收
- 变量提升 是把变量的声明 提升到当前作用域的最前面
- 作用域是在 定义的时候 确定的 并不是 调用的时候.
- 函数的形参 相当于 函数的局部变量
# 闭包
- 闭包指的是 定义在函数内部的函数 并且 被外部所引用
- 优点 让局部变量 持久保存 防止污染
- 用处 模拟全局变量 主要用于封装
- 函数的形参是局部变量
- 闭包 变量持久保存
# 字面量和构造函数
- var res = "123" //字面量写法
- var res1 = new String("123") //构造函数写法
- 构造函数 首字符大写
function P(name, age) {
this.name = name
this.age = age
}
1
2
3
4
2
3
4
- var obj = new P("name", "25") 生成构造函数的 实例对象
# this
- 事件处理函数 内部 this 指向 绑定该事件的 DOM 对象
- 构造函数内部 this 指向 该构造函数的实例对象
- 对象内部的 this 指向 该对象本身
- 除上述情况之外 this 指向 window
- 在没有改变 this 指向的前提下 函数的 this 谁调用指向谁
改变 this
- call apply 是在调用的时候 改变的 this 指向
- bind 是在 定义的时候 改变的 this 指向 并返回一个 新函数
- call apply 他们俩的区别是
- 参数区别 call 的参数是展开的 apply 的参数 是在 一个 数组内部
# 面向对象
面向对象 是一种编程思想 主要用于 封装
一般有三种模式
- 工厂模式
- 构造函数模式
- 原型对象模式
开发的过程中 最常用是 构造函数 结合原型对象模式
将私有的属性放到 构造函数 内部 公共属性定义到 构造函数的 原型对象上面
定义在构造函数 原型对象上面的 属性还有 方法 会被 实例对象 所继承
# 构造函数
// es5
function Person(name, age) {
this.name = name
this.age = age
this.type = '人'
}
// Person("name", 65)//内部 this指向 window 相当于 往window 对象上 定义了 name age type
console.log(window)
var p = new Person('name', 67) //生成实例对象
console.log(p)
// 每一个实例对象 都有一个 constructor 属性 指向它的 构造函数 .name 指 该实例对象指向构造函数的 名字
console.log(p.constructor.name)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// es6
class Person {
constructor(name, age) {
this.name = name
this.age = age
}
say() {
console.log(this.name)
}
}
var p = new Person('name', 20)
p.say()
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 原型对象
- 在 js 中 万物皆对象 每当定义一个对象的时候 对象中都会包含一些 预先定义好的属性 其中 函数对象 的一个属性 就是 原型对象 prototype 普通对象 没有该属性
- 但是 普通对象 会有
__proto__属性 - 每个函数对象 都有一个 prototype 属性 指向其 原型对象
- 原型对象上面的方法 会被 实例对象 所继承
- 原型对象内部的 this 指向 构造函数本身
- 所有对象都有 原型链 指向其 构造函数的 原型对象
# 原型链
- 主要用于 继承
- 每一个对象 不管是 函数对象还是 普通对象 都会有
__proto__属性 指向它 构造函数的原型对象 - 每当访问对象的 属性的时候 首先会在该对象 内部 进行查找 如果没有找到 就会沿着
__proto__ - 向上一层 接着查找 一直找到 null 为止
- 函数的原型链 指向其构造函数 Function 的原型对象
- 实例对象 它的原型链 本身指向 构造函数 Person 的 原型对象
# new
- 创建一个 空对象
- 将空对象的 原型链 指向 构造函数的 原型对象
- 将构造函数内部的属性 定义到 空对象上
- 把 构造函数内部的 this 指向 改变成 新对象
# 对象合并
- assign 主要用于 合并独享 只能深拷贝 单层属性
- 如果 对象内 有属性时 引用类型 则仍存在 引用关系
- 把后面的对象 合并到 第一个 参数的 对象中去