JavaScript中.bind(this)是按引用还是按值传递?
关于
bind方法中this传递与绑定的细节解答 嘿,这个问题问到点子上了,刚好是JavaScript里bind方法和this绑定的核心知识点,我给你一步步讲明白:
1. 传递给bind的this是按引用还是按值传递?
在JavaScript里,对象类型的参数都是按引用传递的,所以当你把this(如果它是一个对象)传给bind时,传递的是这个对象的引用,而不是对象的副本。也就是说,bind会保存这个引用,而不是复制整个对象。
2. 外部修改this对象属性后,调用foo时用哪个this值?
这里要分两个层面看:
- this的指向:
bind的核心作用就是永久绑定函数的this指向,一旦用bind绑定了某个this引用,不管之后你用什么方式调用foo(哪怕用call/apply试图改变this),foo内部的this永远都是调用bind时传入的那个对象。 - 对象属性的访问:因为传递的是对象引用,如果你在外部修改了这个对象的属性,那么调用
foo时,函数内部访问到的是这个对象的最新属性值——毕竟你操作的是同一个对象。
举个直观的例子
// 模拟父作用域的this对象 const myContext = { value: "初始值" }; // 在父作用域中绑定this到foo const foo = function() { console.log(`当前this的value属性:${this.value}`); }.bind(myContext); // 外部修改myContext的属性 myContext.value = "修改后的值"; // 调用foo foo(); // 输出:当前this的value属性:修改后的值 // 哪怕用call试图改变this,也没用 foo.call({ value: "试图覆盖的值" }); // 还是输出:当前this的value属性:修改后的值
这个例子里,bind保存了myContext的引用,所以修改myContext的属性后,foo能拿到最新值;但foo的this指向永远是myContext,无法被后续的调用方式改变。
总结一下
- 传递给
bind的对象类型this是按引用传递的; - 调用
foo时,内部的this指向是调用bind时的那个对象引用,不会变成调用foo时的this;但对象的属性变化会同步反映到函数内部,因为引用的是同一个对象。
内容的提问来源于stack exchange,提问作者hitecherik
相关产品推荐
相关产品推荐

