函数绑定是通过bind方法将函数的this永久固定为指定对象并预设部分参数,返回新函数而不立即执行;常用于事件回调、定时器及参数预填充,与call/apply的立即执行不同,且不支持箭头函数。

函数绑定指的是让一个函数的 this 指向固定为某个对象,不管它后续怎么被调用。JavaScript 中的 bind 方法就是专门干这事的:它不执行函数,而是返回一个新函数,这个新函数调用时 this 永远绑定你指定的对象。
bind 的基本用法
语法很简单:fn.bind(thisArg, arg1, arg2, ...)。第一个参数是将来调用时的 this 值,后面的参数是预先“填好”的实参(也叫预设参数或柯里化)。
-
thisArg可以是任意值,比如对象、null、undefined,甚至原始值(但会被包装成对应对象) - 如果原函数有多个参数,
bind后再调用时传的参数会追加在预设参数之后 -
bind返回的函数不能再次用bind改变this(已被锁定),也不能用call/apply覆盖
常见使用场景
最典型的是事件回调和定时器中避免 this 丢失:
- 给 DOM 元素绑定事件时,方法里的
this默认不是类实例,用bind(this)就能保持指向 -
setTimeout(obj.method, 100)会导致method内部this变成window或undefined,改写成setTimeout(obj.method.bind(obj), 100)就行 - 做参数预填充,比如
const add5 = add.bind(null, 5),之后调用add5(3)相当于add(5, 3)
bind 和 call/apply 的区别
call 和 apply 是立即执行函数,并临时指定 this;bind 不执行,只返回绑定后的新函数,适合“延迟调用”或“复用绑定逻辑”。
立即学习“Java免费学习笔记(深入)”;
-
func.call(obj, a, b)→ 立即运行,this是obj -
func.apply(obj, [a, b])→ 立即运行,this是obj,参数用数组传 -
const bound = func.bind(obj, a)→ 不运行,返回函数,之后bound(b)相当于func.call(obj, a, b)
注意点和小技巧
bind 后的函数继承原函数的 length(形参个数),但只算未被预设的参数个数;另外,箭头函数没有自己的 this,所以对它调用 bind 是无效的。
- 多次 bind 不会叠加效果,只有第一次生效(后续 bind 被忽略)
- 想让绑定函数也能被 new 调用(构造函数模式),bind 返回的函数支持 new —— 此时
this会指向新实例,而不是 bind 时传入的对象 - 现代写法中常用箭头函数或 class 字段箭头函数替代 bind,减少手动绑定,比如
handleClick = () => { ... }
基本上就这些。bind 不复杂但容易忽略细节,关键是理解它“返回新函数 + 固定 this + 预设参数”三位一体的作用。











