前端面试——做用域链、原型链、闭包

1.做用域链、原型、原型链、闭包?

https://www.cnblogs.com/pssp/p/5204324.htmlhtml

https://cnodejs.org/topic/59662f6dbda29e0f7480235bnode

https://blog.csdn.net/zhizhiC/article/details/79734611闭包

 结论函数

  • 做用域链的做用主要用于查找标识符,看成用域须要查询变量的时候会沿着做用域链依次查找,若是找到标识符就会中止搜索,不然将会沿着做用域链依次向后查找,直到做用域链的结尾。
  • 原型链是用于查找引用类型的属性,查找属性会沿着原型链依次进行,若是找到该属性会中止搜索并作相应的操做,不然将会沿着原型链依次查找直到结尾。

1.1 做用域链性能

      内部环境能够经过做用域链来访问外部环境的属性和方法,可是,外部环境不能访问内部环境的任何属性和方法。注意,只能经过定义函数来延长做用域链条。spa

1.2 闭包.net

     概念:闭包就是可以读取其余函数内部变量的函数。因为在Javascript语言中,只有函数内部的子函数才能读取局部变量,所以能够把闭包简单理解成“定义在一个函数内部的函数”。因此,在本质上,闭包就是将函数内部和函数外部链接起来的一座桥梁。prototype

    例子:函数b就是一个闭包函数,用于获取函数a内部的变量i。当函数a的内部函数b,被函数a外的一个变量c引用的时候,就建立了一个闭包。指针

    做用:闭包能够用在许多地方。它的最大用处有两个code

  • 能够读取函数内部的变量
  • 让这些变量的值始终保持在内存中

    注意事项:

    1)因为闭包会使得函数中的变量都被保存在内存中,内存消耗很大,因此不能滥用闭包,不然会形成网页的性能问题,在IE中可能致使内存泄露。解决方法是,在退出函数以前,将不使用的局部变量所有删除。

    2)闭包会在父函数外部,改变父函数内部变量的值。因此,若是你把父函数看成对象(object)使用,把闭包看成它的公用方法(Public Method),把内部变量看成它的私有属性(private value),这时必定要当心,不要随便改变父函数内部变量的值。

1.3 原型链

      原型:全部的函数都有一个特殊的属性prototype(原型)prototype属性是一个指针,指向的是一个对象(原型对象),原型对象中的方法和属性均可以被函数的实例所共享。所谓的函数实例是指以函数做为构造函数建立的对象,这些对象实例均可以共享构造函数的原型的方法。

     原型链:原型链是用于查找引用类型(对象)的属性,查找属性会沿着原型链依次进行,若是找到该属性会中止搜索并作相应的操做,不然将会沿着原型链依次查找直到结尾。常见的应用是用在建立对象继承中。

     下面给出建立对象的原型模式,以及相应的原型链的图。

        函数Person中有一个原型指针prototype,指向Person Prototype,其中包含了Person共享的属性和方法,其中的constructor指向Person。函数Person的函数实例person1和person2各自有一个[[Prototype]],都指向了Person Prototype,好比person1.sayName()或者person2.name,获得的都是Person Prototype中的,由于这两个函数实例没有定义本身的实例属性。(实例属性和原型属性,见下篇文章