最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 连续bind返回值的个人理解

    正文概述 掘金(甜甜圈小佩奇)   2021-04-05   391

    对连续bind的一些理解:

    先贴上自己理解的手写bind实现,参考了一些大佬的理解:

    zhuanlan.zhihu.com/p/160315811

    zhuanlan.zhihu.com/p/85438296

    Function.prototype.myBind = function(asThis, ...arg) {
    	let _this = this;
    	if (typeof _this !== 'function') {
    		throw new Error('not a function');
    	}
    	let newFn = function() {
    		console.log('打印的asThis', asThis);//帮助理解
    		console.log('打印的_this', _this);//帮助理解
    		return _this.apply(
    			newFn.prototype.isPrototypeOf(this) ? this : asThis,
    			[...arg, ...arguments]
    		)
    	}
    	newFn.prototype = _this.prototype;
    	return newFn;
    }
    

    自己的测试运行代码:

    function fn(age) {
    	console.log(arguments);
    	console.log(this.name, age);
    }
    
    let o1 = {
    		name: 'xiao_ming'
    	},
    	o2 = {
    		name: 'xiao_hong'
    	},
    	o3 = {
    		name: 'xiao_jun'
    	};
    
    let a = fn.bind(o1, 10);
    let b = a.bind(o2, 22);
    let c = b.bind(o3, 99);
    c(18); //xiao_ming 15
    fn.bind(o1, 10).bind(o2, 22).bind(o3, 99)(18); //xiao_ming 10
    
    fn.myBind(o1, 10).myBind(o2, 22).myBind(o3, 99)(18); //xiao_ming 10
    

    浏览器打印出如下内容:

    连续bind返回值的个人理解 自己的理解: 1、bind()方法会创建一个新的函数; 2、bind()的第一个参数为新函数的this的指向,后边的参数会作为新函数的前几个参数传入; 3、新函数在运行时,会调用原函数; 4、连续bind会产生闭包,算是一种函数柯里化的应用。 fn.bind(o1, 10).bind(o2, 22).bind(o3, 99)(18);相当于:

    let a = fn.bind(o1, 10);
    let b = a.bind(o2, 22);
    let c = b.bind(o3, 99);
    c(18);
    

    c(18)在运行的时候,会调用b函数,并把参数99, 18(bind直接绑定的参数会在前)传给b函数,b函数内部this指向o3;

    b在运行的时候,会调用a函数,并把参数22, 99, 18传给a函数,a函数内部this指向o2;

    a在运行的时候,会调用fn函数,并把参数10, 22, 99, 18传给fn函数,fn函数内部this指向o1;

    即最后执行的时候相当于fn.apply(o1, 10, 22, 99, 18),this指向为o1,且fn会接收到10、22、99、18这四个参数。

    上边的实现的myBind和js自身的bind有不一样的地方

    测试代码如下:

    let a = fn.bind(o1); //自带的bind
    let aa = new a();
    let b = fn.myBind(o1); //自己实现的bind
    let bb = new b();
    
    console.log(a.prototype); //undefined
    console.log(aa.__proto__ === a.prototype); //false
    console.log(aa.__proto__ === fn.prototype); //true
    
    console.log(b.prototype); //{constructor: ƒ}
    console.log(bb.__proto__ === b.prototype); //true
    console.log(bb.__proto__ === fn.prototype); //true
    

    产生了这些差异,自己的理解:

    bind()方法会创建一个新的函数,这个新函数相当于原函数的副本,但在原型链上并不存在关系。新函数的prototype为undefined

    (同样typeof值为'function',但prototype属性值为undefined的还有任意箭头函数,console.log等)

    通过新函数new出来的实例,这个实例的__proto__指向原函数的prototype。理解为这个示例是由原函数这个构造函数生成的。

    如何解决自己实现bind的这一不一致的问题,暂时没找到,希望读者可以帮忙解决这一不一致。


    起源地下载网 » 连续bind返回值的个人理解

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元