javascript - javascript:function.bind(object) 的问题 - “this”保留为全局对象
问题描述
我对 Javascript 中的函数绑定有疑问。
确保我阅读了我能找到的所有 StackOverflow 的答案(比如这个),并遵循了 Mozilla 开发者指南的说明和示例
这是我的代码的相关部分:
class Collection extends Array {
constructor (...args) {
super(...args)
}
each (callback) {
this.forEach(element => {
callback.bind(element)(element)
// bind the function THEN call it with element as argument
// but I also tried :
// callback.bind(element)()
// callback.call(element, element)
// let bound = callback.bind(element); bound()
})
}
}
//the tests :
let el1 = {x:1, y:"somevars"}
let el2 = {x:42, y:"another"}
let col = new Collection()
col.push(el1)
col.push(el2)
// the test
col.each(element => console.log(Object.keys(this)))
// and I get ['console', 'global', 'process' ...] all the global variables
// instead of ['x','y'] which is what I want
我真的不明白为什么它不起作用......
对于context,它是解决 Codewars 上一个有趣的 kata,而不是生死攸关的问题。
解决方案
好的,正如@Teemu 所指出的,箭头函数不能被绑定......
但是有了这种洞察力,我可以寻找一种绕过它的方法,并找到 另一个 StackOverflow 的帖子 ,它给出了一个窍门:
(从帖子复制粘贴)
function arrowBind(context, fn) {
let arrowFn;
(function() {
arrowFn = eval(fn.toString());
arrowFn();
}).call(context);
}
arrowBind(obj, () => {console.log(this)});
这工作得很好,新的这是上下文......
但在我的情况下并没有解决这个难题(“没有定义”)我需要进一步研究
推荐阅读
- html - 如何在同一行的主要 div 之后留下次要 div?
- python - 在 python 中使用套接字的基本网络服务器
- javascript - 在 Localhost 上使用 XMLHttpRequest 进行文件上传不会触发 PHP 脚本
- css - 是否可以仅使用 CSS 选择元素的绝对最后一个孙子?
- c# - Visual Studio 2019 中的每个项目是否有启用“淡化未使用的使用”和“删除和排序使用”的设置?
- python - 作为线程执行的 Python 异步和同步函数
- azure-functions - Azure Durable Functions 扇出缩放行为不如预期
- bash - 在 MATLAB 中,如何将 Unix 标准输出存储在单元格数组中以进行多行命令?
- r - spark_apply 无法运行程序“Rscript”:在目录“C:\Users\username\AppData\Local\spark\spark-2.3.3-bin-hadoop2.7\tmp\local\spark-..\userFiles
- python - 从表中创建 Python 对象