2018-03-21 | Javascript | UNLOCK

javascript学习笔记

javascript学习笔记

arguments:实参集合

当我们不知道用户具体要传递几个参数时,我们无法设置形参个数,遇到此类需求,需要使用函数内置的实参集合:arguments

  1. arguments只有函数才有

  2. 不管执行函数的时候是否传递实参,arguments天生就存在,没传就是个空集合,传了就包含所有传递的值

  3. 不管是否设置了形参,arguments中始终存储了所有实参的信息

closure:闭包

函数执行会形成一个私有作用域,让里面的私有变量和外界互不影响(相互不干扰、外面无法直接获取里面的变量值),此时我们可以理解为私有作用域把私有变量保护起来,我们把这种保护机制称之为闭包

  • 优点:

    • 变量私有,不会造成全局污染
    • 代码模块化
  • 缺点:
    • 在IE下容易发生内存泄漏

栈内存

作用域(全局作用域/私有作用域):提供一个供JS代码执行的环境

堆内存

所有的引用数据类型,它们需要存储的内容都在堆内存中(相当于一个仓库,目的是存储信息)

  • 对象会把键值对存储起来
  • 函数会把代码当作字符串存储进来

OOP:面向对象

  • 继承:子类继承父类中的属性和方法;
  • 封装:
    • 将相同代码整合到一个方法里;
    • 特点:低耦合高内聚。
  • 多态:当前方法的多种形态;
    • 包含重载和重写;
    • 在js中不存在重载;
    • 重写:子类重写父类的方法。

构造函数

  • 目的:为了创建一个自定义类,并且创建这个类的实例;
  • 与工厂模式的区别:执行的时候:普通函数直接传值执行,构造函数需要通过new一个实例来执行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//=> 工厂模式:
function createPerson(name,age){
var obj = {};
obj.name = name;
obj.age = age;
obj.writeJs = function(){
console.log('我是'+this.name+',我今年'+this.age+'岁');
};
return obj;
}
var p1 = createPerson('小王','18');
p1.writeJs();

//=> 构造函数:
function CreateStudents(name,age){
this.name = name;
this.age = age;
this.writeJs = function(){
console.log('我是'+this.name+',我今年'+this.age+'岁');
}
}
var p2 = new CreateStudents('小王','19');
//通过new执行后,CreateStudent就是一个类了,p2就是CreateStudent这个类的一个实例
p2.writeJs();
  • js中所有的类都是函数数据类型的,它通过new执行变成了一个类,但是它本身也是一个普通的函数;
  • 构造函数模式中拥有类和实例的概念,并且实例和实例之间是相互独立开的。

prototype:原型链

  • 基于构造函数模式的原型链模式,解决了方法或者属性公有的问题,将实例之间相同的属性和方法提取成公有的属性和方法;
  • 每一个函数数据类型(普通函数、类)都有一个天生自带的属性prototype(原型),并且这个属性是一个对象数据类型的值;
  • prototype上天生就有一个属性constructor(构造函数),属性值是当前函数(类)本身;
  • 每一个对象数据类型(普通对象、实例、prototype)也天生自带一个属性:proto,属性值是当前实例所属类的原型(prototype)。
1
2
3
4
5
6
7
8
9
10
11
function CreateStudents(name,age){
this.name = name;
this.age = age;
};
CreateStudents.prototype.writeJs = function(){
console.log('我是'+this.name+',我今年'+this.age+'岁');
}
var p1 = new CreateStudents('小红',19);
var p2 = new CreateStudents('小王',20);
console.log(p1.writeJs === p2.writeJs); // true
p1.writeJs();

call,apply,bind

call:
首先我们让Function原型上的call方法执行,在执行call方法的时候,我们让fn方法中的this变为第一个参数值obj;然后再把fn这个函数执行;

1
2
3
4
5
6
7
8
var obj = {
name: '小明'
};
function fn(){
console.log(this);
}
fn(); //=> 这时this指向window
fn.call(obj); //=>此时this指向obj

call和apply的区别:call接收的参数类型不一样,aplly接收两个参数,第二个参数是数组。

请针对 Disqus 开启代理