关于bind方法与箭头函数的两个失效场景的技术咨询
你的bind和箭头函数问题拆解
嘿,咱一步一步来把这两个坑给你捋明白!
第一场景:bind只“绑定”不“执行”
你写的这段代码:
const obj = { a: 42, say: function() { console.log(this.a); } }; obj.say.bind(obj); // 无输出结果
问题出在bind方法的本质上:它的作用是创建一个绑定了指定this的新函数,但它不会自动执行这个新函数!你现在只是生成了绑定后的函数,却没调用它,自然不会有输出。
如果要让它输出结果,你需要调用这个绑定后的函数,比如:
// 方式1:直接调用绑定后的函数 obj.say.bind(obj)(); // 方式2:先存起来再调用 const boundSay = obj.say.bind(obj); boundSay();
这样就能正常打印出42了。
第二场景:箭头函数的this不随调用对象变
再看这个场景:
const obj = { a: 42, say: () => { console.log(this.a); } }; obj.say(); // 输出undefined
箭头函数的规则很特殊:它没有自己的this,它的this是继承自定义时所在的外层作用域的this,而不是调用它的那个对象。
在这个例子里,say箭头函数是在全局作用域下定义的(假设你是在全局环境写的这段代码),所以它的this指向全局对象(浏览器里是window,Node.js里是globalThis,严格模式下可能是undefined),而全局对象里没有a这个属性,所以打印出来就是undefined。
要解决这个问题,把箭头函数改成普通函数就行,这样它的this就会指向调用它的obj对象:
const obj = { a: 42, say: function() { console.log(this.a); } }; obj.say(); // 输出42
内容的提问来源于stack exchange,提问作者Max Wolfen
相关产品推荐
相关产品推荐

