您现在的位置是:亿华云 > IT科技类资讯
前端百题斩——快速手撕Call、Apply、Bind
亿华云2025-10-04 03:32:40【IT科技类资讯】1人已围观
简介在百题斩js中的这些“this”指向都值得了解中已经简要概述了call、apply、bind三个方法,这三者作用是相同的,均可以改变this指向,从而让某对象可以调用自身不具备的方法,本节将深入理解这
在百题斩js中的前端这些“this”指向都值得了解中已经简要概述了call、apply、百题bind三个方法,斩快这三者作用是速手撕相同的,均可以改变this指向,前端从而让某对象可以调用自身不具备的百题方法,本节将深入理解这三者的斩快实现原理。
15.1 call()
15.1.1 基础
call() 方法使用一个指定的速手撕 this 值和单独给出的一个或多个参数来调用一个函数。其返回值是前端使用调用者提供的this值和参数调用该函数的返回值,若该方法没有返回值,百题则返回undefined。斩快
基本用法:
function.call(thisArg,速手撕 arg1, arg2, ...)小试牛刀
function method(val1, val2) { return this.a + this.b + val1 + val2; } const obj = { a: 1, b: 2 }; console.log(method.call(obj, 3, 4)); // 1015.1.2 实现
实现一个call函数,将通过以下几个步骤:
获取第一个参数(注意第一个参数为null或undefined时,前端this指向window),百题构建对象 将对应函数传入该对象中 获取参数并执行相应函数 删除该对象中函数,斩快消除副作用 返回结果 Function.prototype.myCall = function (context, ...args) { // 获取第一个参数(注意第一个参数为null或undefined时,this指向window),构建对象 context = context ? Object(context) : window; // 将对应函数传入该对象中 context.fn = this; // 获取参数并执行相应函数 let result = context.fn(...args); // 消除副作用 delete context.fn; // 返回结果 return result; } // …… console.log(method.myCall(obj, 3, 4)); // 1015.2 apply()
15.2.1 基础
apply() 方法调用一个具有给定this值的函数,网站模板以及以一个数组(或类数组对象)的形式提供的参数。其返回值是指定this值和参数的函数的结果。call() 和 apply()的区别是call()方法接受的是参数列表,而apply()方法接受的是一个参数数组;
基本用法
func.apply(thisArg, [argsArray])小试牛刀
function method(val1, val2) { return this.a + this.b + val1 + val2; } const obj = { a: 1, b: 2 }; console.log(method.apply(obj, [3, 4])); // 1015.2.2 实现
apply和call的区别主要是参数的不同,所以其实现步骤的call大体类似,如下所示:
Function.prototype.myApply = function (context, arr) { context = context ? Object(context) : window; context.fn = this; let result = arr ? context.fn(...arr) : context.fun(); delete context.fn; return result; } // …… console.log(method.myApply(obj, [3, 4])); // 1015.3 bind()
15.3.1 基础
bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,云服务器供调用时使用。该函数的返回值是一个原函数的拷贝,并拥有指定的this值和初始参数。
基本用法
function.bind(thisArg[, arg1[, arg2[, ...]]])小试牛刀
function method(val1, val2) { return this.a + this.b + val1 + val2; } const obj = { a: 1, b: 2 }; const bindMethod = method.bind(obj, 3, 4); console.log(bindMethod()); // 1015.3.2 实现
实现一个bind函数相对较复杂一些,应该注意以下几点:
能够改变this指向; 返回的是一个函数; 能够接受多个参数; 支持柯里化形式传参 fun(arg1)(arg2); 获取到调用bind()返回值后,若使用new调用(当做构造函数),bind()传入的上下文context失效。 Function.prototype.myBind = function (context, ...args) { if (typeof(this) !== function) { throw new TypeError(The bound object needs to be a function); } const self = this; // 定义一个中装函数 const fNOP = function() { }; const fBound = function(...fBoundArgs) { // 利用apply改变this指向 // 接受多个参数+支持柯里化形式传参 // 当返回值通过new调用时,this指向当前实例 (因为this是当前实例,实例的隐士原型上有fNOP的实例(fnop);fnop instanceof fNOP为true) return self.apply(this instanceof fNOP ? this : context, [...args, ...fBoundArgs]); } // 将调用函数的原型赋值到中转函数的原型上 if (this.prototype) { fNOP.prototype = this.prototype; } // 通过原型的方式继承调用函数的原型 fBound.prototype = new fNOP(); return fBound; }本文转载自微信公众号「执鸢者」,可以通过以下二维码关注。转载本文请联系执鸢者公众号。
很赞哦!(3)
相关文章
- 小白注册网站域名该怎么办?有什么步骤?
- ICANN 规章禁止转移已经被记录或者在60天前内转移的域名。
- 公司名字不但要与其经营理念、活动识别相统一,还要能反映公司理念,服务宗旨、商品形象,从而才能使人看到或听到公司的名称就能产生愉快的联想,对商店产生好感。这样有助于公司树立良好的形象。
- 3.dns修改成功后,点击“域名解析”,按提示进行操作。解析格式一般如下:
- 为什么说注册域名注意细节?哪些我们不能忽视?
- 打开https://www.aizhan.com/输入自己想要查询的域名然后按回车键,如果做过网站都会有数据显示出来
- 4、企业无形资产:通用网站已成为企业网络知识产权的重要组成部分,属于企业的无形资产,也有助于提升企业的品牌形象和技术领先形象。它是企业品牌资产不可或缺的一部分。
- 6、提示添加成功,点击确认进行最后的确定操作。一般10分钟就解析生效,可以用域名进行访问了。
- ④注册门槛低
- 域名资源有限,好域名更是有限,但机会随时都有,这取决于我们能否抓住机会。一般观点认为,国内域名注册太深,建议优先考虑外国注册人。外国注册人相对诚实,但价格差别很大,从几美元到几十美元不等。域名投资者应抓住机遇,尽早注册国外域名。
热门文章
站长推荐
3、商标域名一经注册,就可以作为域名裁决过程中的主要信息之一。这可以大大增加公司被抢注的相关域名胜诉的机会。
3、商标域名一经注册,就可以作为域名裁决过程中的主要信息之一。这可以大大增加公司被抢注的相关域名胜诉的机会。
为了避免将来给我们的个人站长带来的麻烦,在选择域名后缀时,我们的站长最好省略不稳定的后缀域名,比如n,因为我们不知道策略什么时候会改变,更不用说我们将来是否还能控制这个域名了。因此,如果站长不是企业,或者有选择的话,如果不能选择域名的cn类,最好不要选择它。
为什么喜欢国外注册域名?国外注册域名注意什么?
解析之后一般在十分钟内生效,如果没有生效可以联系域名服务商进行沟通。
换新域名(重新来过)
在此期间,他们每天仍在这里卖大米,在理财方面个人感情有待提高。因为现在是收米的最佳时机。
主流搜索引擎显示的相关搜索项越多,越能积极反映该域名的市场价值。同时,被评估域名的搜索引擎显示结果不佳可能是由于以下两个原因: