js高级面试题3座大山之原型链,闭包和递归

235 阅读2分钟

006APoFYly8h0ulqxfsskj30gq0hs3zv.jpg

原型链

想要弄懂原型链首先要懂构造函数,原型对象和实例对象者之间的关系.

构造函数

所谓 ”构造函数”,就是一个普通的函数,只不过我们专门用它来生成对象(new 构造函数),这样使用的函数,就是构造函数.(一般默认函数名首字母大写)

构造函数: 有一个prototype属性, 指向原型对象

原型对象

创建函数的时候,系统会自动创建一个对应的对象。 称之为原型对象。

constructor属于原型对象,指向构造函数

实例对象

new构造函数创建的对象就是实例对象

实例对象 : 有一个__proto__属性,指向原型对象

111.png

理清三者的关系后我们再来看看什么是原型链

原型链 : 每一个对象都有原型,原型也是对象也有自己的原型,以此类推形成链式结构

原型链的作用:内存资源浪费 + 全局变量污染

面试点应该原型链最大的作用:继承

.对象访问原型链规则: 就近原则

  • 先访问自己,自己没有找原型,原型没有找原型的原型,直到原型链终点。 如果还找不到,属性则获取undefined,方法则报错xxx is not defined

光看文字可能很难理解

1559053096356.png

闭包

闭包 = 函数 + 上下文的引用或者可以说一个访问另一个函数变量的函数

 function fn(){
    let a = 1
    function fn1() {
        console.log(a)
    }
    fn1()
}

当我在一个函数内部调用另一个函数的变量的时候就形成了闭包

最大的作用就是:减少变量污染

递归

  • 1.递归函数:一个函数自己调用自己

  • 2.递归函数特点

    • a.一定要有结束条件,否则会导致死循环

    • b.能用递归函数实现的需求,就一定可以用循环调用函数来解决,只是代码简洁与性能不同而已

一个函数递归
 function fn(){
   console.log('难受啊');
   fn();          
 };
 fn();
 两个函数递归
 function fn1(){
     console.log('我爱你');
     fn2();

 };

 function fn2(){
     console.log('我不爱你了');
     fn1();

 };
 fn2();

递归的作用: 遍历dom树 + 深拷贝

真要讲起来就太复杂了,想深入了解请百度

003MWcpMly8gvih6zv0osj60hs0em75j02.jpg