bind方法

bind方法: 创建一个新函数,借用旧函数,并提前绑定this和参数值。
    何时使用: 在创建方法时,就需要提前绑定this对象和参数值
    如何使用: 2步:
      1. 使用bind方法,基于现有函数创建新函数,并绑定this对象和部分参数值:
var newFun=fun.bind(obj[,参数1,参数2,...])

      2. 调用newFun,传入剩余参数: newFun(剩余参数)


<span style="font-size:18px;"><!DOCTYPE html>
<head>
	<meta charset="utf-8"/>
	<title>css001</title>
</head>
<body>
	<script>
		var hmm={ename:"Han Mei",base:5000}
		var lilei={ename:"Li Lei",base:4000}
		function calc(base,bonus){//定义一个计算器
			document.write(
				"<h1>"+this.ename+":"+(base+bonus)+"</h1>"
			);
		}

		calc.call(lilei,lilei.base,7000);
		calc.call(hmm,hmm.base,5000);

		//李蕾买了一个自己的计算器
		var lilei_calc=calc.bind(lilei,lilei.base);//bind可以提前绑定对象和部分参数,写确定的参数
		lilei_calc(4000);//this---李蕾
		//被bind所占的计算器,别人就用不了了
		lilei_cal.call(hmm,hmm.base,8000);

		//笔试:
		/*call vs apply  vs   bind
		共同点:都是在调用时,动态指定函数中的this
		不同点:
			1.call,apply借用,临时绑定
			2.bind 永久绑定
		返回值:
			1.call,apply不 创建 新函数,仅 调用 原函数
			2.bind基于原函数,创建新函数对象
			之后调用的其实是新函数对象
		参数:
			2,call,apply在调用的时候传入所有参数
				call,要求独立传入每个参数
				apply,要求将参数放入数组,统一传入
			2,bind可在创建函数提前绑定部分参数
				调用函数时,
		

		严格模式:54-57的标题
		比普通模式更严格的执行方式

		*/
	</script>
</body>
</html>
</span>


### bind方法的基本语法和功能 在JavaScript中,`bind` 方法用于创建一个新的函数,并将指定的 `this` 值绑定到该函数。它还可以预设一部分参数,在调用时传入剩余的参数。与 `call` 和 `apply` 不同的是,`bind` 不会立即执行函数,而是返回一个已绑定上下文的新函数。 其基本语法如下: ```javascript function.bind(thisArg[, arg1[, arg2[, ...]]]) ``` 其中,`thisArg` 指定了函数执行时的 `this` 值,后续参数为可选参数,将在调用绑定函数时作为前置参数传递给原函数 [^1]。 ### bind方法的使用场景 #### 1. **绑定函数的执行上下文** 当函数被作为回调函数调用时,`this` 的指向可能会发生变化。通过 `bind` 可以显式地绑定 `this`,确保函数在任何上下文中调用都能正确引用预期的对象。 例如: ```javascript const obj = { value: 42, getValue: function() { console.log(this.value); } }; setTimeout(obj.getValue, 100); // 输出 undefined,因为 this 指向 window 或 undefined(严格模式) // 使用 bind 绑定 this setTimeout(obj.getValue.bind(obj), 100); // 输出 42 ``` #### 2. **柯里化函数** `bind` 允许我们在函数调用前预设一些参数,实现部分参数绑定的功能。 ```javascript function multiply(a, b) { return a * b; } const double = multiply.bind(null, 2); console.log(double(5)); // 输出 10 ``` 在此示例中,`multiply` 函数的第一个参数被固定为 `2`,从而生成了一个“双倍”函数 [^3]。 ### bind方法的模拟实现 为了更深入理解 `bind` 的工作原理,可以尝试手动实现一个简化版本。以下是一个基础实现: ```javascript Function.prototype.myBind = function(context) { const fn = this; const args = Array.prototype.slice.call(arguments, 1); return function() { return fn.apply(context, args.concat(Array.prototype.slice.call(arguments))); }; }; ``` 这个实现包括了以下几个关键点: - 保存原始函数(即调用 `myBind` 的函数)。 - 提取预设参数。 - 返回一个新的函数,该函数在调用时使用 `apply` 并传入绑定的上下文和参数。 如果希望支持构造函数调用的形式,则需要进一步扩展,如判断是否通过 `new` 调用并返回新实例 [^3]。 ### bind与其他方法的比较 | 方法 | 是否立即执行 | 是否支持参数列表 | 是否支持指定 this | |--------|----------------|--------------------|----------------------| | call | 是 | 是 | 是 | | apply | 是 | 否(仅支持数组) | 是 | | bind | 否 | 是 | 是 | 通过对比可以看出,`bind` 更适合用于延迟执行的场景,尤其是在事件监听或异步操作中保持上下文一致性 [^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值