Javascript 将一个回调从模块a传递到B,并将其绑定,仍然具有B的作用域

Javascript 将一个回调从模块a传递到B,并将其绑定,仍然具有B的作用域,javascript,scope,webpack,babeljs,es6-promise,Javascript,Scope,Webpack,Babeljs,Es6 Promise,如果我通过了从模块A到模块B的“测试”功能,原因是什么: //A.js import B from './B' export default { self: this, test: ()=> { console.log(self === this) // this should return true but doesn't because when B calls it, "this" is B }, initA:function()

如果我通过了从模块A到模块B的“测试”功能,原因是什么:

 //A.js
import B from './B'
export default {
    self: this,
    test: ()=> {
        console.log(self === this)  // this should return true but doesn't because when B calls it, "this" is B
    },
    initA:function() {
        B.initB(this.test); // b is undefined here
    }
};

//B.js
export default {
  callback: null,
  initB: function (func) {
    callback = func;
  },
  startTest: function () {
    this.callback();
  }
};
当我在B.js中运行callback()时,
this
的作用域仍然是B?如果我将此函数设为箭头函数,也不起作用

我创建了一份回购协议,证明了这一问题:


希望有这方面经验的人能够给出一个快速而简单的解决方案。

您在ES6模块的顶层有一个静态声明的lambda,其中没有可供绑定的周围
。您从未显式地
bind
ing函数,因此
this
的值应该是未定义的。看起来Babel在传输时没有提供强制未定义的绑定,您最终得到的是前面的
this

对于带有箭头函数的对象文字,似乎存在一些混淆。箭头函数在声明时获取周围作用域的
这个
值;对象文字不算作作用域,因此arrow函数不会绑定到对象

如果要绑定回调,只需将
A
模块更改为:

export default {
  self: this,
  makeTest: function () {
    return () => {
      console.log(self === this)
    };
  },
  initA: ()=> {
    B.initB(this.makeTest());
  }
};
它应该开始工作了。如您所见,arrow函数现在位于对对象调用的实方法中


您还有一个切身的问题,您的
import'B'
行旨在导入
/B.js
文件,但实际上正在查找
node\u模块/B/[entrypoint].js
(即使涉及到网页包)。

能否添加导入
a.js
代码的方式并清理格式?我发现你的问题很难理解,因为JavaScript代码无效。如果您能提供一个@marksimularum也会有所帮助。很抱歉,延迟了,请参阅我的编辑:)您能提供一个预期的结果和当前的结果吗?您的许多代码对我来说似乎没有多大意义:例如,模块
A.js
中的所有
this
语句在使用时都是
未定义的。请检查此问题:@MarkSimulacrum@MarkSimulacrum我专门为此创建了一个回购协议,感谢您的帮助:这是一个令人印象深刻的思考过程!又快