javascript中bind()函数实现和应用以及多次bind的结果的思考

一. 概述

在ECMA-262第五版引入了bind()方法,该方法创建一个新函数。

二. 语法

fn.bind(context[, arg1[, arg2[, ...]]])

第一个参数context将成为返回的新函数的this对象
第二个及以后的参数加上返回的新函数的参数,将作为新函数的参数

三. bind的简单实现原理

    if (!Function.prototype.bind) {
      Function.prototype.bind = function (oThis) {
      	if (typeof this !== 'function') {
          return
        }
      
        let self = this
        let args = Array.prototype.slice.call(arguments, 1)
        return function () {
          return self.apply(oThis, args.concat(Array.prototype.slice.call(arguments))) //这里的arguments是执行绑定函数时的实参
        }
      }
    }

bind函数的核心作用:绑定this、初始化参数

四. 常见应用场景

  1. 改变对象方法里this的值
var ob = {
	name: 'joe',
	getName: function () {
		alert(this.name);
	}
};
// 改变getName方法里原本的this对象为新对象{name: 'haha'}
var app = ob.getName.bind({name: 'haha'});
app();
  1. 提前传入参数,优化代码
// 计算n个面板的百分比宽度
const panelHeight = (length, n) => {
    return `${((n / length) * 100).toFixed(7)}%`;
};

const getPanelHeight = panelHeight.bind(null, length);

getPanelHeight(1),

在这里插入图片描述

五. 多次绑定bind方法

那么你有没有想过,如果使用bind()方法多次绑定,最终得到的this会是哪个绑定的呢?

function say() {
	alert(this.x);
};
var a = say.bind({x: 1});
var b = a.bind({x: 2});
b(); // 这里会输出1还是2呢?

仔细想一下,联系bind函数绑定的内部实现我们会发现,bind内部实现里返回了一个函数,这个函数里的this 如果这个函数没有被执行,那么这this永远就是第一次的。所以最后函数say里的this的值还是由第一次绑定时的参数决定。所以无论使用bind绑定多少次,最终原函数的this值是由第一次绑定传的参数决定的。

参考链接:https://blog.csdn.net/learninginjava/article/details/48914751

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您介绍JSbind函数实现方法。 在JSbind函数是用来改变函数内部this的指向的,它会返回一个新的函数,这个新函数的this指向是我们指定的对象。 以下是一个简单的bind函数实现示例: ```javascript Function.prototype.myBind = function(context) { if (typeof this !== 'function') { throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); } var self = this; var args = Array.prototype.slice.call(arguments, 1); var fNOP = function() {}; var fBound = function() { var bindArgs = Array.prototype.slice.call(arguments); return self.apply(this instanceof fNOP ? this : context, args.concat(bindArgs)); } fNOP.prototype = this.prototype; fBound.prototype = new fNOP(); return fBound; }; ``` 在这个函数,我们首先判断this是否为函数类型,如果不是,就抛出一个 TypeError,确保我们绑定的是一个函数。然后,我们保存this的引用,将传入的参数保存在args变量,创建一个fNOP函数,最后返回一个新函数fBound。 在fBound函数内部,我们使用apply方法来调用原函数,并且将指定的this和参数传递给它。这里需要注意的是,如果我们使用new关键字来创建fBound函数的实例,那么this指向的就是这个实例对象,否则this指向的就是我们指定的context对象。 最后,我们使用原型链来继承原函数,并将fBound函数的原型指向fNOP的实例,这样我们就可以在fBound函数访问原函数的prototype属性了。 希望这个简单的bind函数实现可以帮助到您。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值