javascript:function.bind(object)有问题;这";保持全局对象

javascript:function.bind(object)有问题;这";保持全局对象,javascript,function,this,bind,Javascript,Function,This,Bind,我对Javascript中函数的绑定有问题 确保我阅读了StackOverflow的所有答案 (如),, 并遵循以下说明和示例: 以下是我的代码的相关部分: 类集合扩展了数组{ 构造函数(…参数){ 超级(…args) } 每个(回调){ this.forEach(元素=>{ callback.bind(元素)(元素) //绑定函数,然后使用元素作为参数调用它 //但我也试过: //callback.bind(元素)() //callback.call(元素,元素) //let bound=c

我对Javascript中函数的绑定有问题

确保我阅读了StackOverflow的所有答案 (如),, 并遵循以下说明和示例:

以下是我的代码的相关部分:

类集合扩展了数组{
构造函数(…参数){
超级(…args)
}
每个(回调){
this.forEach(元素=>{
callback.bind(元素)(元素)
//绑定函数,然后使用元素作为参数调用它
//但我也试过:
//callback.bind(元素)()
//callback.call(元素,元素)
//let bound=callback.bind(元素);bound()
})
}
}
//测试:
设el1={x:1,y:“somevars”}
设el2={x:42,y:“另一个”}
let col=新集合()
col.push(el1)
col.push(el2)
//测试
col.each(element=>console.log(Object.keys(this)))
//我得到['console','global','process'…]所有的全局变量
//而不是我想要的['x','y']
我真的不明白为什么它不起作用

对于上下文,解决一个有趣的问题 ,
这不是生死攸关的问题。

好的,正如@Teemu所指出的,箭头函数不能被绑定

但有了这样的洞察力,我可以找到一种绕过这个问题的方法,并发现 这给了我们一个窍门:

(从帖子粘贴的副本)

这很好,新的这是背景


但这并不能解决我的问题(‘having未定义’)我需要进一步研究

好的,正如@Teemu所指出的,箭头函数不能绑定

但有了这样的洞察力,我可以找到一种绕过这个问题的方法,并发现 这给了我们一个窍门:

(从帖子粘贴的副本)

这很好,新的这是背景


但这并不能解决我的问题(‘having is not defined’)。相反,您可以使用
集合中的参数来完成回调正文。每个
,如下所示:

类集合扩展了数组{
构造函数(…参数){
超级(…args);
}
每个(回调){
const callbackParts=callback.toString().split('=>'),
arg=callbackParts.shift().split(',)[0]。替换(/\(\\)/g',),
body=arg+'.'.+callbackParts.join('=>').trim(),
_回调=新函数(arg,body);
this.forEach(函数(元素){
_回调(元素);
});
}
}
阶级事务{
建造师(姓名){
this.name=名称;
}
已(计数){
返回新代理({
伯爵:伯爵,
道具:这个
},这是propBuilder);
}
}
//用于代理处理的propBuilder
Thing.prototype.propBuilder={
获取(目标、名称){
const context=target.prop;
如果(target.count>1){
上下文[名称]=新集合();
for(设n=0;n0){
上下文[名称]=新事物(名称);
}
返回上下文[名称];
}
};
//测试。。。
康斯特城市=新事物(“大城市”);
city.has(4)个房屋。每个(房屋=>有(2)个门);
city.has(1).cityHall.has(5).offices.each(office=>has(1).door.has(2).旋钮);
city.cityHall.offices.each(office=>has(2.windows.each)(window=>has(1.knob));

console.log(city,city.cityHall.offices[0].windows[0].Thing的旋钮实例)
要解决此问题,您可能不需要回调中的
。相反,您可以使用
集合中的参数来完成回调正文。每个
,如下所示:

类集合扩展了数组{
构造函数(…参数){
超级(…args);
}
每个(回调){
const callbackParts=callback.toString().split('=>'),
arg=callbackParts.shift().split(',)[0]。替换(/\(\\)/g',),
body=arg+'.'.+callbackParts.join('=>').trim(),
_回调=新函数(arg,body);
this.forEach(函数(元素){
_回调(元素);
});
}
}
阶级事务{
建造师(姓名){
this.name=名称;
}
已(计数){
返回新代理({
伯爵:伯爵,
道具:这个
},这是propBuilder);
}
}
//用于代理处理的propBuilder
Thing.prototype.propBuilder={
获取(目标、名称){
const context=target.prop;
如果(target.count>1){
上下文[名称]=新集合();
for(设n=0;n0){
上下文[名称]=新事物(名称);
}
返回上下文[名称];
}
};
//测试。。。
康斯特城市=新事物(“大城市”);
city.has(4)个房屋。每个(房屋=>有(2)个门);
city.has(1).cityHall.has(5).offices.each(office=>has(1).door.has(2).旋钮);
city.cityHall.offices.each(office=>has(2.windows.each)(window=>has(1.knob));

console.log(city,city.cityHall.offices[0].windows[0].Thing的旋钮实例)“箭头函数没有它自己的这个…”好的,我明白了。。。我们需要找到另一种方法来解决这个难题。添加一个答案,我将接受它,并感谢您在
的每个
实现中,向
this.forEach
传递一个函数,而不是一个箭头函数。Kata测试在arrow函数的主体中不包含
这个
,因此您的测试是不同的。原始Array.forEach接受两个参数,回调函数和上下文作为回调中的
this
值使用,但是
this
不受该参数的约束,即使在原始
forEach
中也不受arrow函数回调的约束。如smr所述,您需要
元素的键,而不是
的键。也许Kata测试实际上应该是
jane.has(2).arms.each(arm=>arm.having(1).hand.having(5).fingers)
?我想这项任务是为了解决这个问题。通过将
元素
参数存储在
function arrowBind(context, fn) {
  let arrowFn;
  (function() {
    arrowFn = eval(fn.toString());
    arrowFn();
  }).call(context);
}
arrowBind(obj, () => {console.log(this)});