Если я сейчас правильно понимаю, вы можете использовать Object.values
и Spread Syntax , чтобы выполнить это:
var myFunction = function(param1, param2) {
console.log(param1);
console.log(param2);
}
var functionParameters = {
data1: "test",
data2: "another test"
};
var run = myFunction.bind(null, ...Object.values(functionParameters))
run();
Я бы предположил, что самым простым решением будет просто передать массив ...
var myFunction = function(args) {
args.forEach((i) => console.log(i));
}
var functionParameters = {
1: "test",
2: "another test",
3: "another one"
};
var run = myFunction.bind(null, Object.values(functionParameters)) //Get array of values from the object
run();
Если вы планируете отправлять только определенные значения объекта, как у вас в вашем примере, вы можете использовать Rest Parameters ]:
var myFunction = function(...args) {
args.forEach((i) => console.log(i));
}
var functionParameters = {
data1: "test",
data2: "another test",
data3: "another one"
};
var run = myFunction.bind(null, functionParameters.data1, functionParameters.data2, functionParameters.data3) //Get array of values from the object
run();
//myFunction("This", "function", "will", "now", "take", "unlimited", "parameters");
Поскольку вы используете обычную функцию в setTimeout и setInterval, вам нужно связать функцию или изменить ее на функцию стрелки, чтобы получить этот контекст внутри функции, и setState будет работать
Вот обновленный код для вашего ref
playStep(step) {
this.setState({ clickClass: "button hover" });
this.sounds[step].play();
setTimeout(function(){
this.setState({ clickClass: "button" });
}.bind(this), 300);
}
// Show all steps
showSteps() {
this.setState({ gameConsole: this.state.round });
let num = 0;
let moves = setInterval(function(){
this.playStep(this.state.steps[num]);
this.setState({ gameConsole: "Wait..." });
num++;
if (num >= this.state.steps.length) {
this.setState({ gameConsole: "Repeat the steps!" });
clearInterval(moves);
}
}.bind(this), 600);
}
Также у вас есть пара функций, объявленных внутри компонента, который выполняет setState, поэтому вам нужно, чтобы эти функции либо связывались вручную в конструкторе, либо меняли его на функцию стрелки
Вот обновленная демонстрация codepen https://codepen.io/anon/pen/bOPyVy
this
неизвестно внутри функции обратного вызова. используйте .bind(this)
каждый раз, когда вам нужно получить доступ к this
в более глубоких областях. напр. :
let moves = setInterval(function(){
this.playStep(this.state.steps[num]);
this.setState({ gameConsole: "Wait..." });
num++;
if (num >= this.state.steps.length) {
this.setState({ gameConsole: "Repeat the steps!" });
clearInterval(moves);
}
}.bind(this), 600)