javascript学习笔记
arguments:实参集合
当我们不知道用户具体要传递几个参数时,我们无法设置形参个数,遇到此类需求,需要使用函数内置的实参集合:arguments
arguments只有函数才有
不管执行函数的时候是否传递实参,arguments天生就存在,没传就是个空集合,传了就包含所有传递的值
不管是否设置了形参,arguments中始终存储了所有实参的信息
closure:闭包
函数执行会形成一个私有作用域,让里面的私有变量和外界互不影响(相互不干扰、外面无法直接获取里面的变量值),此时我们可以理解为私有作用域把私有变量保护起来,我们把这种保护机制称之为
闭包。
优点:
- 变量私有,不会造成全局污染
- 代码模块化
- 缺点:
- 在IE下容易发生内存泄漏
栈内存
作用域(全局作用域/私有作用域):提供一个供JS代码执行的环境
堆内存
所有的引用数据类型,它们需要存储的内容都在堆内存中(相当于一个仓库,目的是存储信息)
- 对象会把键值对存储起来
- 函数会把代码当作字符串存储进来
OOP:面向对象
- 继承:子类继承父类中的属性和方法;
- 封装:
- 将相同代码整合到一个方法里;
- 特点:低耦合高内聚。
- 多态:当前方法的多种形态;
- 包含重载和重写;
- 在js中不存在重载;
- 重写:子类重写父类的方法。
构造函数
- 目的:为了创建一个自定义类,并且创建这个类的实例;
- 与工厂模式的区别:执行的时候:普通函数直接传值执行,构造函数需要通过new一个实例来执行。
1 | //=> 工厂模式: |
- js中所有的类都是函数数据类型的,它通过new执行变成了一个类,但是它本身也是一个普通的函数;
- 构造函数模式中拥有类和实例的概念,并且实例和实例之间是相互独立开的。
prototype:原型链
- 基于构造函数模式的原型链模式,解决了方法或者属性公有的问题,将实例之间相同的属性和方法提取成公有的属性和方法;
- 每一个函数数据类型(普通函数、类)都有一个天生自带的属性prototype(原型),并且这个属性是一个对象数据类型的值;
- prototype上天生就有一个属性constructor(构造函数),属性值是当前函数(类)本身;
- 每一个对象数据类型(普通对象、实例、prototype)也天生自带一个属性:proto,属性值是当前实例所属类的原型(prototype)。
1 | function CreateStudents(name,age){ |
call,apply,bind
call:
首先我们让Function原型上的call方法执行,在执行call方法的时候,我们让fn方法中的this变为第一个参数值obj;然后再把fn这个函数执行;
1 | var obj = { |
call和apply的区别:call接收的参数类型不一样,aplly接收两个参数,第二个参数是数组。
请针对 Disqus 开启代理