浅谈用原生 js 实现函数的 bind 方法

bind的作用是让目标函数执行时候的 this 改为指定的上下文。

一般情况下,this 取决于调用者,谁调用函数 this 就是谁(自执行函数、定时器……之类的特殊情况除外)。

有那么一句话,在 JavaScript 中,万物皆对象。

 1 var want = function want() {
 2     console.log(this);
 3 }
 4
 5 var good = function good() {
 6     console.log(‘https://www.cnblogs.com/xwant‘)
 7 }
 8
 9 good.go = want;
10
11 good.go();
12
13 // 控制台打印出good这个函数

函数也是一个对象,以对象调用函数的方式执行这个函数,这个函数的指向就变为了这个调用者。

那么现在将这个方式封装成一个方法。

1 Function.prototype._bind = function _bind(context) {
2      if(typeof context === ‘function‘) return this;
3      context.fuc = this;4      return function () {
5          context.fuc(...arguments)
6      }
7 };

在这里利用 JavaScript 的这个特性,将这个函数,写到了指定上下文的一个属性下。

由于直接返回 context.fun 的话,返回的其实是 context.fun 代表的这个函数体。

所以在调用这个方法的时候,方法中 this 还是指向的 window ,于是这里套用了一个匿名函数来解决这个问题。

由于不知道要修改 this 的函数是否有形参,所以在执行的时候把匿名函数中的 arguments 拉下来,在函数执行时,将 arguments 以 ES6 的新特性解构赋值的方式传进去,由此,函数的参数问题也解决了(只测试了简单的传参没有深入测试)。

当然,这里只论方法暂且就不说性能方面的问题。

通过 .call 或者 .apply 的方式也可以实现 bind 方法,这里不多讨论。

把上面的代码改巴改巴, .call 和 .apply 也就实现了。

文章可能存在思路或者理解上的偏差,如果各路高手有意见或建议,还望指点一二。

时间: 2024-10-19 23:02:56

浅谈用原生 js 实现函数的 bind 方法的相关文章

浅谈用原生 js 实现数组的 slice 方法

slice 方法有这几种情况:不传参.传一个参数.传两个参数.并且传参支持负数,具体每个情况的效果在这里就不说了. 核心方法:通过 for 循环遍历 调用此方法的数组 ,把要取出的内容放入新数组,然后将新数组返回. 一切的条件处理判断,都为了 for 循环能够正确的执行 这是好久以前写的了,虽然就8行代码,但是三元运算符套用的太多了,还没加括号,现在回过头来看看真是满眼的星星. Array.prototype._slice = function _slice() { var n1 = Numbe

浅谈ES6原生Promise

浅谈ES6原生Promise 转载 作者:samchowgo 链接:https://segmentfault.com/a/1190000006708151 ES6标准出炉之前,一个幽灵,回调的幽灵,游荡在JavaScript世界. 正所谓: 世界本没有回调,写的人多了,也就有了})})})})}). Promise的兴起,是因为异步方法调用中,往往会出现回调函数一环扣一环的情况.这种情况导致了回调金字塔问题的出现.不仅代码写起来费劲又不美观,而且问题复杂的时候,阅读代码的人也难以理解. 举例如下

【JS】怎样用原生JS实现jQuery的ready方法

Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,只是与window.onload方法还是有差别的. 总的来说,window.onload()方法是必须等到页面内包含图片的全部元素载入完成后才干运行. $(document).ready()是DOM结构绘制完成后就运行,不必等到载入完成.   详细一些.能够从下面几方面对照它们的差别: 1.运行时间 window.onload必须等到页面内包含图片的全部元素载入完成后才干运

【JS】如何用原生JS实现jQuery的ready方法

Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的. 总的来说,window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行.$(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕.   具体一些,可以从以下几方面对比它们的区别: 1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行

浅谈小网站SEO的几点建设方法

现在很多小企业也开始建站,那该怎样做好小企业的seo呢? 1.通过seo树立品牌 对于小企业来说,当然不能做到像大型企业一样品牌人人皆知.但是与其他同等小企业.竞争对手相比,如果能够在搜索引擎结果中表现良好,就可以树立 良好的形象.所谓"排名第一就是品牌",在搜索引擎中排名第一就能让客户感觉到企业是一个充满活力.办事认真.积极上进的组织,客户第一面就打上了良 好的印象分.排名第一带来的客户在互联网真是数不甚数.那么如何通过seo树立品牌呢?第一,要使自己的企业名.地区行业关键字排名第一

浅谈局域网ARP攻击的危害及防范方法(图)

浅谈局域网ARP攻击的危害及防范方法(图)   作者:冰盾防火墙 网站:www.bingdun.com 日期:2015-03-03   自 去年5月份开始出现的校内局域网频繁掉线等问题,对正常的教育教学带来了极大的不便,可以说是谈“掉”色变,造成这种现象的情况有很多,但目前最常见的是 ARP攻击了.本文介绍了 ARP攻击的原理以及由此引发的网络安全问题,并且结合实际情况,提出在校园网中实施多层次的防范方法,以解决因ARP攻击而引发的网络安全问题,最后介 绍了一些实用性较强且操作简单的检测和抵御攻

js 的 call apply bind 方法

js的call apply bind 方法都很常见,目的都是为了改变某个方法的执行环境(context) call call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) thisObj可选项.将被用作当前对象的对象.arg1, arg2, argN ..可选项.将被传递方法参数序列. 如果没设置严格模式 “use strict” 当thisObj 不存在或 为 undefined 或为 null 或为 this 时,则隐式地指向 全局对象(在浏览器中即为 wi

JS中call,apply,bind方法的总结

why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user: "小马扎", fn: function(){ console.log(this.user); } } var b = a.fn; b(); // undefined 我们是想打印对象a里面的user却打印出来undefined是怎么回事呢?如果我们直接执行a.fn()是可以的. var a = { user: "小马扎

浅谈webview与js交互

浅谈下webview与js的交互,项目中因为需要获取页面中的许多属性,所以用到了这些,让后端在方法中传了过来. 下面的demo是本地的html代码,具体可以仿写,都差不多,注重思想. 1:项目目录 2:jump的代码 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"/> <script type="text/