浅谈函数的几个经典面试题

80 阅读2分钟

一. 函数this的三种指向

首先来理解一下环境对象this:谁'调用'我(this),我(this)就指向谁。 小技巧: 没点没new是window, 有new是实例,有点是点左边的对象

1.普通函数

函数名() :this指向window

  function fn() {
        console.log(this)
    } 
   fn()//this指向window

2.对象方法

对象名.方法名() : this指向前面的对象

   let obj = {
        name:'张三',
        learn: function(){
        console.log(this)
    }
    obj.eat()  //  this指向obj

3.构造函数

new 函数名() : this指向new创建实例对象

   function createPerson(name,age,sex){
   //this的四个作用:
    //(1)创建一个空对象
    //(2)this指向这个对象
    //(3)给对象赋值
    //(4)返回这个对象
    this.name=name
    this.age=age
    this.sex=sex
   }
   let p1=new createPerson('张三',18,'男')
   console.log(p1);//createPerson实例对象
   

二.函数上下文调用

修改函数内部的this

  1. 函数名.call(修改后的this,形参1,形参2…………)
  2. 函数名.apply(修改后的this, 数组或伪数组
  3. 函数名.bind(修改后的this) bind注意点:
  • 不会立即执行函数,而是得到一个修改this之后的新函数
  • bind一般用于修改: 定时器函数、事件处理函数
all 和 apply 和 bind 三者区别
相同点 :

作用一致,修改函数this指向

不同点 :
  1. 传参方式不同 : call是按照顺序传参, apply是数组/伪数组传参
  2. 执行机制不同 : call和apply会立即执行函数,而bind不会立即执行而是得到修改this的新函数

三. 闭包

  1. 闭包closure:是一种函数和上下文引用的组合,也可以说是一个访问其他函数内部变量的函数
  2. 闭包作用 : 解决变量污染

代码演示如下:

image.png

四. 递归

  1. 递归函数: 一个函数在内部调用自己
  2. 递归作用和循环类似的,也需要有结束条件
  3. 递归应用:浅拷贝与深拷贝 浅拷贝与深拷贝:
  • 浅拷贝:拷贝的是地址,修改拷贝的数据会影响原来的数据
  • 深拷贝 :拷贝的是数据,修改拷贝的数据不会影响原来的数据 注意点: 浅拷贝与深拷贝有两种方式 方式一(推荐使用) : JSON方式实现
  • let newObj = JSON.parse( JSON.stringify( obj ) )

方式二 : 使用递归思路,遍历dom树,处理起来比较麻烦,难以理解

下面的代码就是用递归的方式演示

let obj = {
        name: '张三',
        age: 20,
        sex: '男',
        hobby: ['吃饭', '睡觉', '学习'],
        student: {
            name: "班长",
            score: 90
        }
    }
    function copy(obj, newObj) {
        for (let key in obj) {
            if (obj[key] instanceof Array) {
                newObj[key] = []
                copy(obj[key], newObj[key])
            } else if (obj[key] instanceof Object) {
                newObj[key] = {}
                copy(obj[key], newObj[key])
            } else {
                newObj[key] = obj[key]
            }
        }
    }
    let newObj = {}
    copy(obj, newObj)
    newObj.name = '李四'
    newObj.hobby[0] = '游戏'
    newObj.student.score = 100
    console.log(obj, newObj);

以上就是我对函数的几个经典面试题理解。