bind方法返回永久绑定this的新函数,其内部[[BoundThis]]槽固化绑定值,后续call/apply无法覆盖,仅new调用时this失效但参数仍保留。

bind 是 JavaScript 中实现显式绑定并永久锁定 this 指向的核心方法。它不会立即执行函数,而是返回一个新函数,该函数的 this 值被固定为 bind 的第一个参数,且无法被后续调用方式(如 call、apply、事件绑定、隐式调用)改变。
bind 的基本用法和永久性原理
bind 返回的是一个“绑定函数”(bound function),其内部有一个不可修改的 [[BoundThis]] 内部槽,用于存储绑定时指定的 this 值。这个值在函数创建时就固化了,之后任何调用都无法覆盖。
- 语法:
fn.bind(thisArg, arg1, arg2, ...) - 返回新函数,原函数不受影响
- 即使对返回的函数再调用
call(obj)或apply(obj),this仍为最初绑定的对象
为什么 bind 能“永久锁定”this?
ECMAScript 规范规定:当调用一个绑定函数时,引擎会忽略传入的 thisArg,直接使用其内部的 [[BoundThis]]。这意味着:
-
obj.method.bind(obj)()→this是obj -
const bound = fn.bind({x: 1}); bound.call({y: 2})→this仍是{x: 1},不是{y: 2} - 在事件监听器中使用:
btn.addEventListener('click', handler.bind(obj)),确保 handler 内this始终是obj
常见误用与注意事项
虽然 bind 锁定 this 很可靠,但要注意几个实际细节:
立即学习“Java免费学习笔记(深入)”;
- 重复 bind 不会覆盖:多次调用
bind仍以第一次绑定的this为准(后续 bind 只影响预设参数) - 箭头函数没有自己的
this,不能被bind改变(它继承外层作用域的this) -
bind同时支持预设参数(柯里化):例如add.bind(null, 2)创建一个始终把第一个参数固定为 2 的新函数 - 若绑定
null或undefined,非严格模式下会被自动替换为全局对象(如window),严格模式下则保持原值
对比 call/apply:它们只是临时绑定
call 和 apply 是一次性显式绑定,只在当次调用生效:
-
fn.call(obj)→ 仅本次this === obj -
fn.bind(obj)()→ 每次调用都保证this === obj - 所以需要反复使用的场景(如回调、事件、定时器),
bind更安全省心


















