「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」。
函数三种代用模式(this指向)
this指向:谁‘调用’我,我就指向谁
this指向取决于函数的调用,与函数声明无关
-
普通函数: 函数名()==> this指向window
-
对象方法: 对象名.方法名() ==> this指向对象
-
构造函数: new 函数名() ==> this指向new创建的实例对象
注意点: 定时器的this默认一定是window
函数上下文调用模式
修改this的指向
-
函数名.call(修改后的this,实参1,实参2.....)
-- 适用于一个形参
-
函数名.apply(修改后的this,数组/伪数组)
-- 适用于多个形参
-
函数名.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
函数上下文三种调用方式的区别
-
传参方式不同
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 })
递归函数
-
在函数内部调用自己
-
递归函数特点:
--与循环类似
--一般开发中能用循环实现,也可以用递归实现。只是写法不同
--学习递归也要有结束条件,否则会导致死循环
-
单函数递归
--自己调用自己
-
双函数递归
--两个函数互相调用
加油加油!!
努力学习!!