为何使用bind(null)绑定函数后,this仍指向Window对象?
关于bind()绑定后this指向的疑问解答
为什么bind(null)后this指向Window而非null?
在非严格模式下,JavaScript引擎会把null或undefined作为bind的第一个参数时,自动替换为全局对象(浏览器环境就是Window)。如果开启严格模式(在函数顶部加'use strict'),bind(null)就会让this真的指向null。
测试严格模式的代码示例:
function printThis() { 'use strict'; console.log(this); } const obj = { boundFunction: printThis.bind(null) } obj.boundFunction(); // 输出 null
为什么调用obj.boundFunction()时this不指向obj?
因为bind()会创建一个永久绑定了this值的新函数,这个绑定的优先级是最高的——不管你用什么方式调用这个新函数(作为对象方法、用call/apply、甚至作为构造函数),它的this都不会再被修改(再次bind也无法覆盖第一次的绑定)。
所以哪怕你把绑定后的函数挂到obj上作为方法调用,也不会改变它已经被bind固定的this指向。
为什么没形成和obj或null的闭包?
bind()确实会创建闭包,但它的闭包是用来保存你绑定的this值和预设参数的,不是和obj关联。这里的闭包是绑定函数内部引用了bind时传入的null(非严格模式下被替换为Window),所以调用时会用这个保存的值,而不是动态取调用时的上下文(比如obj)。
简单说,bind后的函数已经“记住”了要使用的this值,和它后来被挂载到哪个对象上完全无关。
内容的提问来源于stack exchange,提问作者Just another dev
相关产品推荐
相关产品推荐

