我在从类外部获取某些var的值时遇到问题。
我想访问attack,但是由于某些原因它未定义。有人可以在这里帮助我吗?

码:

index.js(我尝试从中访问变量)

import $ from 'jquery';
import Tone from 'tone';
import EnvelopeModule from './envelope.js';

$(document).ready(() => {

  const envelope = new EnvelopeModule();
  console.log(envelope.attack); //undefined

  initApp();
});


信封.js(我在其中设置变量的地方)

import $ from 'jquery';
import Tone from 'tone';

export default class EnvelopeModule {
  constructor(attack) {
    this.attack = attack;
    this.init();
  }

  init() {
    this.addListeners();
  }

  addListeners() {
    $('input#attack').on('input change', this.set);
  }

  set() {
    this.attack = $('input#attack').val()/100;
    let val = $(this).val()/100;
    $(this).prev().text(val);
  }
}

最佳答案

您将您的朋友发送到邮局领取包裹。他走出门,您就打了电话,问:“嘿,那个包裹里有什么?”您的朋友回答:“我不知道。我现在还没有邮局。”您可以每隔十分钟打电话给您的朋友,看看他是否收到了,但这是一个坏主意,因为


您的朋友可能会做一些有用的事情,这会占用很多时间,并且
这可能会导致延迟:如果您在他拿到包裹之前立即再次致电,您要再等九分钟才能找到包裹中的内容


取而代之的是,您告诉您的朋友在他拿到包裹后立即打电话给您。没有浪费的时间,当他拿起它后,您便会发现里面的东西。

那么,那个故事与您的代码有什么关系?

attack属性仅在input元素上发生changeinput#attack事件时才具有有意义的值。您要在任何有意义的事件发生之前立即要求attack值。相反,您只需等待:attack仅在set函数运行时才具有有意义的值。

如果希望index.js指定每次attack更改时要运行的任意代码,则可以通过将函数作为参数传递给构造函数来实现:

export default class EnvelopeModule {
  constructor(attack, runMeWhenAttackChanges) {
    this.attack = attack;
    this.runMeWhenAttackChanges = runMeWhenAttackChanges;
    this.init();
  }

  init() {
    this.addListeners();
  }

  addListeners() {
    $('input#attack').on('input change', this.set.bind(this));
  }

  set(e) {
    this.attack = $(e.currentTarget).val()/100;
    let val = $(e.currentTarget).val()/100;
    $('input#attack').prev().text(val);
    this.runMeWhenAttackChanges();
  }
}


(请注意,我修复了您在thisaddListeners中如何处理set的错误。)

然后,在您的index.js内部提供该runMeWhenAttackChanges函数:

const envelope = new EnvelopeModule(undefined, function() {
    console.log(this.attack);
});


this.attack的值仅在回调函数内部才有意义。需要最新值attack的任何操作都应从该回调内部运行。此回调不会立即运行,并且可能会在周围的代码完成很长时间之后运行很多次。您可以将此回调视为每次attack更改时要运行的一组指令,并且我们已将这些指令封装在函数中。 (回到原始的比喻,这是您的朋友每次拿起包裹时都会打电话给您。)

09-28 08:09