我在从类外部获取某些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
元素上发生change
或input#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();
}
}
(请注意,我修复了您在
this
和addListeners
中如何处理set
的错误。)然后,在您的
index.js
内部提供该runMeWhenAttackChanges
函数:const envelope = new EnvelopeModule(undefined, function() {
console.log(this.attack);
});
this.attack
的值仅在回调函数内部才有意义。需要最新值attack
的任何操作都应从该回调内部运行。此回调不会立即运行,并且可能会在周围的代码完成很长时间之后运行很多次。您可以将此回调视为每次attack
更改时要运行的一组指令,并且我们已将这些指令封装在函数中。 (回到原始的比喻,这是您的朋友每次拿起包裹时都会打电话给您。)