是否可以将一个功能“分配”给另一个功能?

时间:2020-05-19 08:55:34

标签: javascript function loops animation

我对编码还很陌生,我正在寻找建议。

我在动画循环中有一组函数,这些函数根据变量值执行。这意味着我实际上是在检查每帧的值并执行相关的功能。

由于变量的值仅在用户输入时发生变化,因此我正在考虑将if else-语句移出动画循环。我想知道是否可以将关联的功能“分配”给另一个在循环中运行但可以更改其内容的功能。

对此有何想法? :-)

2 个答案:

答案 0 :(得分:5)

JavaScript中的函数是对象。这意味着变量可以引用函数。¹

因此,如果您具有函数abc,则可以有一个current变量引用当前使用的变量,例如, a

let current = a;

稍后,如果情况有所变化,则可以更新current以引用b

current = b;

无论哪种方式,然后使用current就像使用ab一样:

current(/*arguments go here if any*/);

实时示例:

const btnCall = document.getElementById("btnCall");
let current;

useA();

function a() {
    console.log("Function `a` called");
}

function b() {
    console.log("Function `b` called");
}

function useA() {
    current = a;
    btnCall.value = "Call a";
}

function useB() {
    current = b;
    btnCall.value = "Call b";
}

hook("btnCall", () => {
    current();
});
hook("btnUseA", useA);
hook("btnUseB", useB);

function hook(id, fn) {
    document.getElementById(id).addEventListener("click", fn);
}
<input type="button" value="Call ?" id="btnCall">
<input type="button" value="Use a" id="btnUseA">
<input type="button" value="Use b" id="btnUseB">

Also on CodePen(目前很多人都在摘录)。


¹实际上,每当您不使用对象属性来引用函数时,总是使用“变量”(更准确地说是 binding )来引用函数。功能。当您这样做时:

function example() {
}

...您正在创建一个函数和一个在当前作用域中引用该函数的变量。像这样的函数声明创建的变量实际上与var变量相同。变量(varlet),常量(const)和函数参数都是保存值的绑定,包括对诸如函数之类的对象的引用。 / p>

答案 1 :(得分:1)

不确定是否会帮助您,但是您可以尝试一下 创建一个包含所需值的函数的对象,每个函数的键应为输入中的值。 例如:

let obj = {
    someValue : function1,
    someOtherValue: function2
} 
function function1(){
    console.log('function 1')
}

function function2(){
    console.log('function 2')
}

function getUserInput(value){
    obj[value]();
}
getUserInput('someValue');
getUserInput('someOtherValue');