当前位置: 首页 > wzjs >正文

制作公司网站在公账汇款时用途备注什么北仑网站建设培训学校

制作公司网站在公账汇款时用途备注什么,北仑网站建设培训学校,网页模板下载 知乎,WordPress文章图片怎么上传✋🏻前言 又到了金三银四的跳槽潮,面试官真的时不时会问到call、apply、bind的相关问题,利用一点碎片化的时间,我整理了如下... 目录 ✋🏻前言 call 入参 返回值 底层 apply 入参 返回值 底层 bind 入参 返…

✋🏻前言

又到了金三银四的跳槽潮,面试官真的时不时会问到call、apply、bind的相关问题,利用一点碎片化的时间,我整理了如下...

目录

✋🏻前言

call

入参

返回值

底层

apply

入参

返回值

底层 

bind

入参

返回值

底层 

总结


call

call(context, arg1, arg2 ... argn);
入参

context:this的指向,非严格模式下null和undefined会变成window对象,基础数据类型会转化为引用类型

arg1...argn 可选值

返回值

对应函数返回值

function fn11(arg1, arg2) {console.log(arg1, arg2);console.log(this);return "我是return值";
}
const self1 = { x: "1111" };
const res1 = fn11.call(self1, 1, 2, 3);
console.log(res1);

如果是箭头函数,则结果不一样

const fn1 = (arg1, arg2) => {// 箭头函数this指向不同;console.log(arg1, arg2);console.log(this);
};
const self1 = { x: "1111" };
const res1 = fn1.call(self1, 1, 2, 3);
console.log(res1);

 有关于this的指向问题,可以看我这篇文章

JS中的this 归纳了所有可能影响this指向改变的情况,不过这里不是我们讨论的重点,所以接下来我都不使用箭头函数

底层

知道了语法、用法以及表现效果,我们来手写一个call

Function.prototype.myCall = function (context, ...arg) {// ...arg表示不知道有多少参数context = context == null || context === undefined ? window : context;context = changeContext(context);// 定义一个属性_fn存储传入的函数thisconsole.log("myCall中的this:", this);context._fn = this;const result = context._fn(...arg); // 不使用...的话arg是一个数组// 用完删掉,防止污染delete context._fn;return result;
};

context表示this指向,...arg表示的是动态的参数,因为call支持不定个数的参数,所以我们选用它

第一行排除null和undefined的情况

function changeContext(ctx) {if (typeof ctx === "string") {return new String(ctx);} else if (typeof ctx === "number") {return new Number(ctx);} else if (typeof ctx === "boolean") {return new Boolean(ctx);} else if (typeof ctx === "symbol") {return new Symbol(ctx);} else if (typeof ctx === "bigint") {return new BigInt(ctx);} else {return ctx;}
}

第二行将基本数据类型转化为引用数据类型,不然后续也无法属性赋值(这块代码后续都有用到)

这块是console输出

知道了this,于是我们将定义一个内部属性_fn赋值为this,然后执行这个context._fn的方法,传入参数...arg

  • 为什么是...arg:因为是ES6的结构语法,如果是arg的话就是一个数组,无法满足call的第二个参数
  • 为什么不直接用this(...arg):因为这样会导致this的指向改变
Function.prototype.myCall = function (context, ...arg) {// ...arg表示不知道有多少参数context = context == null || context === undefined ? window : context;context = changeContext(context);// 定义一个属性_fn存储传入的函数thisconsole.log("myCall中的this:", this);const result = this(...arg); // 不使用...的话arg是一个数组return result;
};
这边打印的就是window对象了

 所以这边我们需要“中转一下”

接着我们就需要把我们定义的_fn删除(这是一个好习惯)

最后返回函数执行结果result,来看最后的打印吧

apply

apply(context, args);
入参

context:this的指向,非严格模式下null和undefined会变成window对象,基础数据类型会转化为引用类型

args 可选值

返回值

对应函数返回值

function fn2(arg1, arg2) {console.log(arg1, arg2);console.log(this);
}
const self2 = [222];
const res2 = fn2.apply(self2, [1, 2, 3]);
console.log(res2);

apply和call很相似,我们直接来看底层

底层 
Function.prototype.myApply = function (context, arg) {context = context == null || context === undefined ? window : context;context = changeContext(context);// 定义一个属性_fn存储传入的函数thiscontext._fn = this;const result = context._fn(...arg);// 用完删掉,防止污染delete context._fn;return result;
};

可以看到,唯一的改变点就是入参变成了arg,因为传入的arg是一个数组 | 类数组

然后需要注意的是context._fn中的参数还是...arg结构的结果,在前面的使用部分我们也会看到,arg1、arg2分为对应的1,2而不是[1,2],undefined   

所以底层的知识很重要,根据现象知道本质

bind

bind(context, arg1, arg2 ... argn);
入参

context:this的指向,非严格模式下null和undefined会变成window对象,基础数据类型会转化为引用类型

arg1...argn 可选值

返回值

新建一个函数,此函数是原始函数的副本

function fn3(arg1, arg2) {console.log(arg1, arg2);console.log(this);console.log(typeof this);
}
const self3 = 33;
const res3 = fn3.bind(self3, 1, 2, 3);
console.log(res3);
res3();
很明显的看出将基础类型转化成了引用类型
底层 
Function.prototype.myBind = function (context, ...bindArg) {context = context == null || context === undefined ? window : context;context = changeContext(context);const _that = this;return function (...newArg) {// return _that.call(context, ...bindArg, ...newArg);context._fn = _that;const result = context._fn(...[...bindArg, ...newArg]);// 用完删掉,防止污染delete context._fn;return result;};
};

入参方面和call一样,只不过返回值方面需要修改

首先,返回一个方法,方法的参数也是不定的

然后有两种实现效果

  1. 直接使用call方法,然后把context,解构后的bindArg和解构后的newArg传入
  2. 第二种方式和上面call、apply的相同,注意函数调用的入参,需要先合并再解构,最后返回函数执行结果

总结

我们花了一篇博文从基础到使用到底层彻底讲通call、apply、bind的相关内容,期间也不可避免的涉及了箭头函数和this指向问题,相信我把所有能配置到的情况都列出来了


现在,你可以无比自信的和面试侃侃而谈了,因为你比他专业~~

如果觉得有收获,麻烦给个赞和关注。你的鼓励是我写作的动力,大家一起学习一起进步。

http://www.dtcms.com/wzjs/592234.html

相关文章:

  • 网页模板王襄阳seo招聘
  • 天津网站优化排名营销型网站设计房地产
  • 沈阳工程建设信息网站中企动力企业
  • 广东网站建设联系wordpress 后台登陆
  • 法律服务网站建设企业vi设计的作用与意义
  • 凡科网站建设好公司logo生成器免费
  • 品牌网站建设源码wordpress实用插件
  • 做网站购买空间多少钱企业建网站需要什么
  • 网站题头是什么设计配色推荐的网站
  • 基于php的个人网站设计论文智能模板网站建设收费
  • 怎么查询网站是谁做的小程序商城哪家好服务
  • 做软装设计找图有什么好的网站网站的手机站页面重复
  • 济宁门户网站建设建邺html5响应式网站
  • 做网站卖什么东西好织梦校园招生网站源码
  • 做网站咋做汉阳网页设计
  • 网络公司建网站广州app搭建
  • 响应式机械类网站网站需要哪些备案
  • 南京市公共资源建设中心网站中装建设集团有限公司股票
  • 蓝田微网站建设中山公司网站建设
  • 外国人做的篆字网站中国建设银行网站首页u盾登入
  • 信阳高端网站建设软件设计师中级考什么
  • 网站开发最佳实践莱芜警方网站官网
  • idc网站是用什么语言做的临沂手机网站开发制作公司
  • 现在公司做网站还需要域名吗事业单位建设网站
  • 市辖区郑州网站建设价格低不是干粉灭火器的优点
  • 做网站运营工资多少wordpress图片服务器
  • 怎样自己做网站模板建设银行网站为什么登不上
  • 隧道建设网站怎么了联想官网网上商城
  • 做淘宝客需要建网站吗企业网站源码搜一品资源
  • 金华网站建设哪里好腾讯云域名