使用bind创建偏函数时,如何正确传递对象自身属性?
问题原因
在对象字面量初始化阶段,this并不指向正在创建的admin对象,而是指向当前代码的全局上下文(浏览器中是window,Node.js环境中是global,严格模式下为undefined),所以this.role无法获取到admin的role属性值,最终导致sendMail的from参数为undefined。
解决方案
以下是几种可行的解决方式:
方式一:使用getter方法
通过getter延迟绑定操作,当访问admin.sendMail时,this会正确指向admin对象:
function sendMail(from, to, content) { console.log(`Sending email from ${from} to ${to} with message as ${content}`); } let admin = { role: `admin`, get sendMail() { return sendMail.bind(this, this.role); } } admin.sendMail(`all`, `Reboot in 15 mins`);
每次访问admin.sendMail都会返回一个新的绑定后的函数,确保from参数始终是当前admin.role的值。
方式二:对象创建后再绑定
先完成admin对象的初始化,再对sendMail进行绑定操作:
function sendMail(from, to, content) { console.log(`Sending email from ${from} to ${to} with message as ${content}`); } let admin = { role: `admin`, } admin.sendMail = sendMail.bind(admin, admin.role); admin.sendMail(`all`, `Reboot in 15 mins`);
这种方式下,admin已经创建完成,直接用admin作为bind的上下文,能正确获取admin.role的值。
方式三:直接封装调用
如果不需要偏函数的特性,也可以直接封装一个函数调用sendMail:
function sendMail(from, to, content) { console.log(`Sending email from ${from} to ${to} with message as ${content}`); } let admin = { role: `admin`, sendMail(to, content) { sendMail(this.role, to, content); } } admin.sendMail(`all`, `Reboot in 15 mins`);
这种方式更直观,调用时this指向admin,能直接获取role属性。
内容的提问来源于stack exchange,提问作者Pramod
相关产品推荐
相关产品推荐

