广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JS前端面试题详解之手写bind
  • 151
分享到

JS前端面试题详解之手写bind

2024-04-02 19:04:59 151人浏览 薄情痞子
摘要

目录bind 的用法this 的指向问题积累参数实现一个 bind结尾大家好,我是前端西瓜哥,今天我们用 js 来实现内置的 bind 方法。 bind 的用法 在实现之前,我们先学

大家好,我是前端西瓜哥,今天我们用 js 来实现内置的 bind 方法。

bind 的用法

在实现之前,我们先学习一下 Function.prototype.bind 的用法。

function.bind(thisArg[, arg1[, arg2[, ...]]])

bind 是函数特有的一个方法,可以创建一个绑定了 this 的新函数。

接受的参数为如下。

  • 第 1 个参数 thisArg:用于修改 this 指向,且 this 一旦修改后将无法再改变。
  • arg1, arg2, ...:剩余的是可选的参数项,会在 bind 返回的新函数调用时,会作为函数的前几个参数去调用。

this 的指向问题

我们在开发的时候,有时候会遇到 JS 的 this 指向丢失问题。

下面我们看一个例子。

const person = {
  nickname: '前端西瓜哥',
  eatWatermelon() {
    console.log(this.nickname + ' 吃西瓜');
  }
};

person.eatWatermelon();

上面的代码中,在调用 person.eatWatermelon 时,this 指向 person,输入结果为 前端西瓜哥 吃西瓜

下面我们再执行下面代码。

const eatWatermelon = person.eatWatermelon;
eatWatermelon();

输入结果就匪夷所思了起来,它是:undefined 吃西瓜

这是因为 this 的指向变成了 eatWatermelon() 执行时所在作用域的 this,在浏览器 script 标签最外层时,是全局对象 window(严格模式下,全局对象 this 会变成 undefined)。

所以  eatWatermelon()  执行中的 this.nickname 等价于 window.nickname,因为我们没有赋值过,所以是 undefined。

有时候我们不希望 this 丢失,该怎么办?

这时候我们就要用到一个 bind 方法,可以永久改变 this 的指向,且不能再改变。

const eatWatermelon = person.eatWatermelon.bind(person);
eatWatermelon();

这样的话,eatWatermelon 函数的 this 就会永远指向 person,能输出我们预期的 前端西瓜哥 吃西瓜

所以,对于一个函数来说,它的 this 指向是在执行时确定的

  • 如果函数是 bind 返回的,this 永远指向执行 bind 绑定的那个 thisArg 值;
  • 如果函数前面有个对象,那 this 指向这个对象;
  • 如果函数前没有对象,那 this 指向当前的作用域(可能是函数作用域,可能是全局作用域)。

另一种控制 this 指向的写法是使用 箭头函数,尤其适合在函数中调用另一个函数的情况,因为篇幅原因这里不展开讲。

积累参数

bind 除了常用于强绑 this 外,另一个用的比较少的作用:预置函数参数。

function add(a, b, c) {
  return a + b + c;
}

const addSix = add.bind(null, 6);
const addSixThenAddFour = addSix.bind(null, 4);
addSixThenAddFour(5)
// 15

addSixThenAddFour(7)
// 17

实现一个 bind

下面进入正题,实现一个 bind。

Function.prototype.myBind = function(thisArg, ...prefixArgs) {
  const fn = this;
  return function(...args) {
    return fn.call(thisArg, ...prefixArgs, ...args);
  }
}

要点是利用 闭包

让返回的新函数可以访问到三个私有属性:

  • fn(原来的函数)
  • thisArg(需要强绑不变的 this 指向)
  • prefixArgs 属性

当我们调用这个新函数时,我们会执行 fn 函数,并利用 call 方法来指定 this 为 thisArg,然后将预填充的多个参数,和新函数接收的参数依次填入。

最后不要忘记返回调用后的值。因为新函数是原函数的封装,返回值也要和原函数表现一致。

结尾

bind 方法的实现并不复杂,更重要的是你要先掌握好 bind 的用法。

就好比做业务需求一样,不明确需求,就容易产生 bug,

然后需要你对闭包有一定的认识,知道如何去保存私有变量,以及封装函数的写法(记得 return 原函数的返回值)。

到此这篇关于JS前端面试题详解之手写bind的文章就介绍到这了,更多相关JS手写bind内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JS前端面试题详解之手写bind

本文链接: https://www.lsjlt.com/news/153825.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JS前端面试题详解之手写bind
    目录bind 的用法this 的指向问题积累参数实现一个 bind结尾大家好,我是前端西瓜哥,今天我们用 JS 来实现内置的 bind 方法。 bind 的用法 在实现之前,我们先学...
    99+
    2022-11-13
  • JS前端面试手写apply和bind实例
    目录前言apply && bindapply && bind 作用相同点 VS 不同点轻松手写手写实现 apply手写实现 bind总结前言 面试官...
    99+
    2022-12-08
    JS面试手写apply bind JS前端面试
  • JS手写bind之处理new的情况详解
    目录new判断函数是否通过 new 被调用new 和 bind实现完整的 bind结尾大家好,我是前端西瓜哥。 之前写了一篇关于 JS 中 bind 方法的实现的文章,并给出了实现:...
    99+
    2022-11-13
  • JS前端面试数组扁平化手写flat函数示例
    目录前言题目 实现扁平化的方法 封装 flatten1. ES6 flat2. toString3. 使用正则替换4. 循环递归4.1 循环 + concat + push...
    99+
    2022-11-13
  • JS前端面试数组扁平化手写flat函数示例分析
    本文小编为大家详细介绍“JS前端面试数组扁平化手写flat函数示例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“JS前端面试数组扁平化手写flat函数示例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。题...
    99+
    2023-07-02
  • JS面试题之forEach能否跳出循环详解
    当年懵懂无知的我被问到这个问题时,脑袋一片空白,当然也没答对,一直以来我对forEach都有一种错误的理解,由于它比原始的for循环简洁许多,导致我一度认为那是为了方便书写所创造出来...
    99+
    2022-11-12
  • 微前端之 js隔离 样式隔离 元素隔离问题详解
    目录WebComponent 介绍js隔离问题解决方法一用 Proxy 代理方法二 用快照样式隔离问题方法一 样式增加不同前缀方法二 ShadawDom元素隔离WebComponen...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作