原型、原型链、作用域、作用域链、闭包

103 阅读2分钟
原型

在js中,每个对象都有__proto__属性,一般这个是被称为隐式的原型,该隐式原型指向构造该对象的构造函数的原型,函数比较特殊,它除了和其他对象一样有__proto__属性,还有自己特有的属性----prototype,这个属性是一个指针,指向一个包含所有实例共享的属性和方法的对象,称之为原型对象。

原型链

当读取实例的属性时,如果找不到,就会查找对象原型中的属性,如果还找不到,就找对象这个原型对象的原型一直找到最顶层null为止。

作用域

作用域是变量与函数的可访问的范围,也就是代码执行的环境,在js中,变量的作用域有全局作用域和局部作用域两种。全局作用域在代码中任何地方都能访问的对象拥有全局作用域,1.未定义变量名直接赋值的2.最外层函数和最外层函数外定义的变量3.window对象下的属性。局部作用域值固定在代码片段内可以访问,最常见的例如函数内部。

作用域链

js中的关键字var和function 都可以提前声明和定义,提前声明和定义的放在我们的内存地址(堆内存)中。然后js从上到下逐行执行,遇到变量就去内存地址查找是否存在这个变量。有就使用,没有就继续向父级作用域查找直到window下结束,这种查找机制叫作用域链。

闭包

能够读取其他函数内部变量的函数称之为闭包。 优点就是我们知道函数内部具有局部作用域,无法访问其内部的变量,那么通过闭包就可以访问。 缺点就是,由于普通函数直接执行后内部变量会被收回,但是闭包的函数在执行完并返回后,js的垃圾回收机制不会收回函数所占用的资源,因为a的内部函数b的执行需要以来a中的变量。