JavaScript 中 this 绑定优先级:new 绑定 vs 显式绑定

风之吻 网站开发 370

new绑定优先级最高,无论函数是否被bind或作为方法调用,只要用new调用,this必指向新实例;显式绑定仅在非new场景生效,且箭头函数不支持call/apply/bind。

JavaScript 中 this 绑定优先级:new 绑定 vs 显式绑定-第1张图片-风享汇

  new 绑定优先级高于显式绑定。

  new 绑定总是胜出

  只要函数被 new 调用,无论它是否已被 bind 过、是否在对象上作为方法存在、或是否被 call/apply 调用过,this 都会指向新创建的实例对象。

  • new 操作内部会强制将 this 绑定到新对象,并跳过所有其他绑定逻辑

  • 即使对一个已用 bind(obj)固定 this 的函数执行 new boundFn() ,最终 this 仍指向新实例,不是 obj

  • 构造函数若显式返回一个对象,则 this 绑定失效(但 new 绑定本身仍发生,只是返回值覆盖了 this 所在对象)

  显式绑定只在非 new 场景下生效

  call、apply、bind 的作用是手动指定 this,但它们的效力仅限于普通调用或方法调用场景。

  •  fn.call(obj) fn.apply(obj)立即执行,this 为 obj —— 前提是没用 new

  •  const bound = fn.bind(obj)返回一个硬绑定函数,后续调用时 this 固定为 obj —— 除非用 new 调用它

  • 箭头函数不参与显式绑定:call/apply/bind 对它无效,因为它没有自己的 this

  优先级链不能跳过

  JavaScript 的 this 绑定按固定顺序判断,不会“混合”或“叠加”:

  • 先看是否 new 调用 → 是,直接走 new 绑定

  • 否则看是否 call/apply/bind → 是,走显式绑定

  • 再看是否对象。方法() → 是,走隐式绑定

  • 最后才是默认绑定(严格模式为 undefined,非严格为全局对象)

  常见误判点

  容易以为 bind 后的函数“永远绑定 this”,其实它只是“永久绑定”,不是“绝对绑定”。

  •  const f = foo.bind({x:1}); f(); → this 是 {x:1}

  •  const f = foo.bind({x:1}); new f(); → this 是新实例,{x:1} 被忽略

  •  obj.method.call(other); → this 是 other,不是 obj(显式覆盖隐式)

标签: java javascript

上一篇SQLite、Json和Mysql三种数据库的优缺点

下一篇当前分类已是最新一篇

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~