javascript 软化绑定

本文深入探讨JavaScript中this绑定的细节,包括被忽略的this、防止this绑定退回到默认规则的措施,以及如何使用软绑定确保函数在不同上下文中正确执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 被忽略的this

如果你传递null或者undefined作为call,apply,或bind的this绑定参数,那么这些值会被忽略掉,取而代之的是默认绑定规则将适用于这个调用。在严格模式下(被调函数内部使用strict模式), this等于undefined, 在非严格模式下,this指向global对象(在浏览器中是window)。

2. 防止this绑定退回到默认绑定的措施

2.1 空对象 {}

2.2 DMZ对象 Object.create(null)

如果想让使用的函数不关心this,可以传递一个空对象作为thisArgs, 但空对象的原型指向Object.prototype,在Object.prototype上添加的任何属性都会影响到大多数对象,因为绝大多数对象原型链终端都是Object.prototype,为了隔离这个副作用,可以传递一个完全为空的对象Object.create(null), 任何对this的隐藏或意外的使用将会被限制在这个空对象中。

2.3 软化绑定

防止退回到默认绑定,意外的修改global对象,同时保持函数可以通过隐含绑定或显式绑定来手动绑定this。

		if(!Function.prototype.softBind) {
			Function.prototype.softBind = function (obj) {
				var fn = this;
					curried = [].slice.call(arguments,1),
					bound = function bound() {
						return fn.apply( (!this || (typeof window !== "undefined" && this === window)
								|| ( typeof global !== "undefined" && this === global)
							) ? obj : this,
							curried.concat.apply(curried,arguments)
						);
					};
					bound.prototype = Object.create(fn.prototype);
					return bound;
			};	
		}

		function foo() {
			console.log("name:" + this.name);
		}

		var obj = {name:"obj"},
			obj2 = {name:"obj2"},
			obj3 = {name:"obj3"};

		var fooOBJ = foo.softBind(obj);
		fooOBJ();//name: obj
		obj2.foo = foo.softBind(obj);
		obj2.foo();//name: obj2
		fooOBJ.call(obj3);
		setTimeout(obj2.foo,10);//name: obj 退回到软绑定

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值