函数的进阶

62 阅读2分钟

「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」。

函数三种代用模式(this指向)

this指向:谁‘调用’我,我就指向谁

this指向取决于函数的调用,与函数声明无关

  1. 普通函数: 函数名()==> this指向window

  2. 对象方法: 对象名.方法名() ==> this指向对象

  3. 构造函数: new 函数名() ==> this指向new创建的实例对象

注意点: 定时器的this默认一定是window

3.png

函数上下文调用模式

修改this的指向

  1. 函数名.call(修改后的this,实参1,实参2.....)

    -- 适用于一个形参

  2. 函数名.apply(修改后的this,数组/伪数组)

    -- 适用于多个形参

  3. 函数名.bind(修改后的this,实参1,实参2.....)

    -- bind()不会立即执行函数,而是得到一个修改this之后的新函数

    -- 适用于不立即执行的函数(定时器函数、事件处理函数)

    -- 如果bind()绑定的时候传参了,则参数也会绑定

    -- 如果bind()没有在绑定的传参,则参数可以在使用时传参

上下文模式

this指向只能是引用类型

如果你传的不是引用类型,编译器会自动帮你转成对象的引用类型

function fn() {
    console.log(this)
}

fn.call(1) //指向内置对象Number
fn.call('a') //指向内置对象String
//如果是undefined或者null ,此时this修改无效。还是之前的this
fn.call(null) //指向window
fn.call(undefined) //指向window
fn.call() //指向window

1.png

函数上下文三种调用方式的区别

  • 传参方式不同

    call用于单个参数,apply用于多个参数

  • 执行机制不同

    call与apply会立即执行,bind不会立即执行

场景

伪数组转数组

什么是伪数组?

-- 有数组的三要素(元素、下标、长度),但是没有数组的方法

-- 伪数组本质是 对象 他的原型指向的是Object的原型,所以无法调用数组原型中的方法

伪数组转真数组

一、声明一个空数组,遍历伪数组将元素添加到数组中

//obj为伪数组
let arr = []
for (let i = 0 ; i < obj.length; i++){
    arr.push(obj[i])
}
//arr就成为由伪数组obj转换而来的真数组

二、利用push方法可以传递多个参数的特点

let arr = []
arr.push.apply(arr,obj)

伪数组的排序

借用别人的方法、给自己用

Array.prototype.sort.call(obj, function(a, b) {return a - b })

递归函数

  • 在函数内部调用自己

  • 递归函数特点:

    --与循环类似

    --一般开发中能用循环实现,也可以用递归实现。只是写法不同

    --学习递归也要有结束条件,否则会导致死循环

  • 单函数递归

    --自己调用自己

  • 双函数递归

    --两个函数互相调用

2.png

加油加油!!

努力学习!!