Javascript 如何在arrow函数内部分配外部变量?

Javascript 如何在arrow函数内部分配外部变量?,javascript,typescript,Javascript,Typescript,我试图为一个在arrow函数之外定义的变量赋值,如下所示: let leftPanel: PerspectivePanel; let rightPanel: PerspectivePanel; let temp = L.withFlex(1, L.box(direction, [ L.withFlex( 1, element => { element.className = 'gllayo

我试图为一个在arrow函数之外定义的变量赋值,如下所示:

    let leftPanel: PerspectivePanel;
    let rightPanel: PerspectivePanel;

    let temp = L.withFlex(1, L.box(direction, [
      L.withFlex(
          1,
          element => {
            element.className = 'gllayoutcell noselect';
            leftPanel = new PerspectivePanel(display, element, perspectiveViewerState);
            this.registerDisposer(leftPanel);
          }),
      L.withFlex(
          1,
          element => {
            element.className = 'gllayoutcell noselect';
            rightPanel = new PerspectivePanel(display, element, perspectiveViewerState2);
            this.registerDisposer(rightPanel);
          }),
    ]))(rootElement);

    leftPanel.otherRenderedDataPanel = rightPanel;
    rightPanel.otherRenderedDataPanel = leftPanel;
但是编译器给我的错误是,变量在定义之前正在使用。如何使内部变量对外可见


编辑:我不明白的是,在它下面的两个赋值之后,如何调用箭头函数get。因为它显然是在他们前面被调用的,元素是rootElement。

编译器正在抱怨,因为
leftPanel
rightPanel
可能还没有被赋值。这是因为它们首先在一个arrow函数中赋值,在编译时调用它们时是未知的

我假设您使用
stricnullchecks:true
。在这种情况下,您可以通过明确说明两个变量中的每一个都可以是未定义的,然后使用类型断言来解决此问题:

let leftPanel: PerspectivePanel | undefined;
let rightPanel: PerspectivePanel | undefined;

...

leftPanel!.otherRenderedDataPanel = rightPanel!;
rightPanel!.otherRenderedDataPanel = leftPanel!;

编译器正在抱怨,因为可能尚未分配
leftPanel
rightPanel
。这是因为它们首先在一个arrow函数中赋值,在编译时调用它们时是未知的

我假设您使用
stricnullchecks:true
。在这种情况下,您可以通过明确说明两个变量中的每一个都可以是未定义的,然后使用类型断言来解决此问题:

let leftPanel: PerspectivePanel | undefined;
let rightPanel: PerspectivePanel | undefined;

...

leftPanel!.otherRenderedDataPanel = rightPanel!;
rightPanel!.otherRenderedDataPanel = leftPanel!;

我通过将reft和right Panel定义为类属性并在arrow函数内部执行
this.rightPanel.otherPanel=leftPanel
解决了这个问题。我仍然不知道为什么另一种方法不起作用,但这对我来说是一种解决办法。

我通过将reft和right Panel定义为类属性,并在arrow函数内部执行我可以执行的操作来解决这个问题。
this.rightPanel.otherPanel=leftPanel
。我仍然不知道为什么另一种方法不起作用,但这对我来说是一种解决办法。

我想它是说对于
leftPanel.otherRenderDataPanel=…
赋值行和下面的一行?请提供一个简单的工作示例。我必须在你的例子中定义很多东西,以便让它达到可以看到错误的地方。。。但是我怀疑您可以在不丢失所有类型的情况下创建错误。是的,leftPanel.OtherRenderDataPanel行。给出了错误。我假设它是说,对于
leftPanel.OtherRenderDataPanel=…
赋值行和下面的一行,请提供一个最小的工作示例。我必须在你的例子中定义很多东西,以便让它达到可以看到错误的地方。。。但是我怀疑您可以在不丢失所有类型的情况下创建错误。是的,leftPanel.otherRenderedDataPanel行给出了错误。很好的建议,但是我得到
类型“RenderedDataPanel | undefined”不能分配给类型“RenderedDataPanel”。类型“undefined”不可分配给类型“RenderDataPanel”
。对,这就是为什么需要非空断言(标识符后面的!)。我知道它没有帮助。很好的建议,但是我得到
类型“RenderDataPanel | undefined”不可分配给类型“RenderDataPanel”。类型“undefined”不可分配给类型“RenderDataPanel”
。这就是为什么需要非空断言(标识符后面的“!”)的原因。我知道它没有帮助。