JS基础学习第五天

做用域

做用域简单来讲就是一个变量的做用范围。
在JS中做用域分红两种:浏览器

1.全局做用域函数

直接在script标签中编写的代码都运行在全局做用域中
全局做用域在打开页面时建立,在页面关闭时销毁。
全局做用域中有一个全局对象window,window对象由浏览器提供,
能够在页面中直接使用,它表明的是整个的浏览器的窗口。
在全局做用域中建立的变量都会做为window对象的属性保存
在全局做用域中建立的函数都会做为window对象的方法保存
在全局做用域中建立的变量和函数能够在页面的任意位置访问。
在函数做用域中也能够访问到全局做用域的变量。
尽可能不要在全局中建立函数和变量。学习

2.函数做用域this

函数做用域是函数执行时建立的做用域,每次调用函数都会建立一个新的函数做用域。
函数做用域在函数执行时建立,在函数执行结束时销毁。
在函数做用域中建立的变量,不能在全局中访问。
当在函数做用域中使用一个变量时,它会先在自身做用域中寻找,
若是找到了则直接使用,若是没有找到则到上一级做用域中寻找,
若是找到了则使用,找不到则继续向上找,一直会找至全局做用域。spa

变量的声明提早prototype

在全局做用域中,使用var关键字声明的变量会在全部的代码执行以前被声明,可是不会赋值。
因此咱们能够在变量声明前使用变量。可是不使用var关键字声明的变量不会被声明提早。
在函数做用域中,也具备该特性,使用var关键字声明的变量会在函数全部的代码执行前被声明,
若是没有使用var关键字声明变量,则变量会变成全局变量3d

函数的声明提早code

在全局做用域中,使用函数声明建立的函数(function fun(){}),会在全部的代码执行以前被建立,
也就是咱们能够在函数声明前去调用函数,可是使用函数表达式(var fun = function(){})建立的函数没有该特性
在函数做用域中,使用函数声明建立的函数,会在全部的函数中的代码执行以前就被建立好了。对象

this

咱们每次调用函数时,解析器(浏览器)都会向函数内部传递一个隐含的参数,这个隐含的参数就是this,
this指向的是一个对象,这个对象称为函数执行的上下文对象,根据函数的调用形式不一样,this会指向不一样的对象。blog

this的不一样的状况:
1.它所在函数以函数的形式调用时,this是window
2.它所在函数以方法的形式调用时,this就是调用方法的对象
3.它所在函数以构造函数的形式调用时,this就是新建立的对象

 

工厂方法

使用工厂方法能够大批量地建立对象

 

构造函数

构造函数就是一个普通的函数,建立方式和普通函数没有区别,不过首字母要大写。

构造函数和普通的函数区别是,他的调用方式不一样。
若是直接调用,它就是一个普通函数。
若是使用new来调用,则它就是一个构造函数。

使用一个构造函数建立的对象,咱们称为一类对象,也将构造函数称为一个类。(构造函数就是类)
经过同一个构造函数建立的对象,成为该类的实例。

构造函数的执行流程:
1.马上建立一个新的对象
2.将新的对象设置为函数中的this,在构造函数中可使用this来引用新建的对象
3.逐行执行函数中的代码
4.将新建的对象做为返回值返回

instanceof 用来检查一个对象是不是一个类的实例
语法:对象 instanceof 构造函数
若是该对象时构造函数的实例,则返回true,不然返回false

Object是全部对象的祖先,因此任何对象和Object作instanceof都会返回true

原型(prototype)

咱们建立的每个函数,解析器都会向函数中添加一个属性prototype
这个属性对应着一个对象,这个对象就是咱们所谓的原型对象。

当函数做为普通函数调用时,prototype没有任何做用

当函数做为构造函数调用时,它所建立的对象中都会有一个隐含的属性,指向该构造函数的原型对象,咱们能够经过_proto_来访问该属性。

原型对象就至关于一个公共的区域,全部同一个类的实例均可以访问到这个原型对象。
咱们能够将对象中共有的属性和方法统一添加到原型对象中,
这样咱们只须要添加一次,就可使全部的对象均可以使用这些属性和方法,不须要为每个对象去添加,也不会影响到全局做用域。

当咱们去访问对象的一个属性或方法时,它会先在对象自身中寻找,
若是在自身中找到了,则直接使用。
若是没有找到,则去原型对象中寻找,若是找到了则使用,
若是没有找到,则去原型的原型中寻找,直到找到Object的原型为止,Object的原型没有原型,值为null,
若是依然没有找到该属性或方法则返回undefined。

 

 

hasOwnProperty()

这个方法能够用来检查对象自身中是否含有某个属性,使用该方法时只有对象自身中含有属性时,才会返回true。(而使用in检查时,若是对象中没有可是原型中有,也会返回true)
语法:对象.hasOwnProperty(“属性名”)

toString方法

当咱们直接在页面中打印一个对象时,事件上是输出的对象的toString()方法的返回值

若是咱们但愿在输出对象时不输出[object Object],能够为对象添加一个toString()方法

1
2
3
4
//修改Person原型的toString 
Person.prototype.toString = function(){
return "Person[name="+this.name+",age="+this.age+",gender="+this.gender+"]";
};

如今的浏览器控制台都直接输出对象所在类及其全部属性了,因此上诉内容仅供学习使用。

垃圾回收(GC)

就像人生活的时间长了会产生垃圾同样,程序运行过程当中也会产生垃圾
这些垃圾积攒过多之后,会致使程序运行的速度过慢,
因此咱们须要一个垃圾回收的机制,来处理程序运行过程当中产生垃圾
当一个对象没有任何的变量或属性对它进行引用,此时咱们将永远没法操做该对象,
此时这种对象就是一个垃圾,这种对象过多会占用大量的内存空间,致使程序运行变慢,
因此这种垃圾必须进行清理。
在JS中拥有自动的垃圾回收机制,会自动将这些垃圾对象从内存中销毁,
咱们不须要也不能进行垃圾回收的操做
咱们须要作的只是要将再也不使用的对象设置null便可。

 

学识浅薄,若有错误,恳请斧正,在下不胜感激。

相关文章
相关标签/搜索