目录
1.作用域
1)全局作用域:
编写在script标签中的JS代码;页面打开创建,关闭销毁
全局对象window-代表一个浏览器窗口,可直接使用
全局作用域中创建的变量都作为window对象的属性保存,函数-方法
全局作用域内的变量都是全局变量,在页面任意位置都可以访问
变量声明提前:使用var关键字会在所有代码执行之前声明变量(但不会赋值undifined),反之不会
函数声明提前:使用函数声明function 函数名(){}的函数会在所有代码执行前被创建,所以可以在函数声明前调用函数
使用函数表达式var 函数名 = function(){};创建的函数不会被声明提前
2)函数作用域
调用函数创建,执行完毕后销毁;每调用一次创建一个作用域,相互独立
全局作用域中无法访问函数作用域的变量
在函数作用域中操作变量时,先找自身作用域,再找上一级作用域;
一直找不到报错:ReferenceError,访问全局作用域中的变量用window对象
函数作用域中使用var关键字、函数声明也有声明提前特性
不使用var声明的变量会成为全局变量
定义形参相当于在函数中声明变量
2.debug调试
3.this
解析器在调用函数时每次都会向函数内部传递一个隐含参数this
指向一个对象(函数执行的上下文对象)
根据函数调用方法不同,this会指向不同对象
- 函数形式调用,this是window
- 方法调用,this是调用方法的那个对象
- 当以构造函数形式调用时,this就是创建的函数
4.使用工厂方法(批量)创建对象
function CreakPerson(){
var obj = new Object();
obj.name = name;
obj.age = age;
}
var obj1 = CreatPerson("Tom",18);
var obj2 = CreatPerson("Judy",12);
使用工厂方法创建对象,使用的构造函数都是Object,所以创建的对象都是Object类型
导致我们无法区分出多种类型的对象
创建一个构造函数,专门用来创建Person对象(习惯首字母大写)
构造函数就是一个普通函数,创建方式和普通函数没有区别
区别在于普通函数是直接调用,构造函数需要new关键字说明
function Person(形参){}
var per = new Person(实参);
将一个构造函数称为一个类
使用同一个构造函数创建的对象称为一类对象,一个称为该类的实例
使用instanceof可以检查一个对象是否是一个类的实例,返回布尔值
对象 instanceof 构造函数
所以对象都是Object的后代
构造函数的执行流程:
- 立刻创造一个对象
- 将新建的对象设置为函数中的this(this引用)
- 逐行执行函数中的代码
- 将新建立的对象作为返回值返回
5.原型prototype
在构造对象中添加一个方法,每执行一次就会创造一个新方法,浪费空间
将同一个方法挪到全局作用域里定义,污染全局作用域的命名空间且不安全
原型prototype
创造的每一个函数都会被解析器添加的属性(每个函数不同)
属性对应一个对象,即为原型对象(prototype)
调用普通函数时,它没作用
调用构造函数时,构造函数创造的对象(实例)中也会有隐含属性指向它,通过__proto__访问
可以将对象中共有的内容(属性/方法)逐一设置到原型对象中
访问对象的一个属性/方法时,先到对象找,再到原型对象里找,最后到原型的原型中找
直到找到Object的原型,它没有原型会返回undefined(null),一般找两次
使用in检查对象中是否含有某属性时,即使这个属性在原型中也会返回true
为避免这情况,用hasOwnProperty("属性名")方法
hasOwnProperty在原型对象的原型对象里
6.toString()
当我们在页面中打印一个对象时,输出的时对象的toString()方法的返回值
toString()在原型的原型里
如果不希望输出对象时输出[object object]可以为对象添加一个toSting()方法
全部修改输出对象则修改原型中的toString()
7.垃圾回收
程序垃圾过多会导致程序运行速度过慢,所以需要垃圾回收机制
当一个对象没有变量引用,就称这个对象是垃圾
var obj = new Object;
obj = null; //表示此对象是垃圾
JS自带自动垃圾回收机制,会将此类对象自动销毁