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

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

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

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

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

 结论

  • 作用域链的作用主要用于查找标识符,当作用域需要查询变量的时候会沿着作用域链依次查找,如果找到标识符就会停止搜索,否则将会沿着作用域链依次向后查找,直到作用域链的结尾。
  • 原型链是用于查找引用类型的属性,查找属性会沿着原型链依次进行,如果找到该属性会停止搜索并做相应的操作,否则将会沿着原型链依次查找直到结尾。

1.1 作用域链

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

前端面试——作用域链、原型链、闭包_第1张图片

1.2 闭包

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

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

前端面试——作用域链、原型链、闭包_第2张图片

    作用:闭包可以用在许多地方。它的最大用处有两个

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

    注意事项:

    1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

    2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

1.3 原型链

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

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

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

前端面试——作用域链、原型链、闭包_第3张图片

前端面试——作用域链、原型链、闭包_第4张图片

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

你可能感兴趣的:(前端面试题)