是否可以将一个函数“赋值”给另一个函数?

3

我是一名编码新手,正在寻求建议。

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

由于变量的值仅在用户输入时更改,因此我想将if-else语句从动画循环中取出。我在思考是否可以将相关函数“分配”给另一个在循环中运行但能够更改其内容的函数。

对此有什么想法吗? :-)


你所说的一组函数是什么意思,是指在循环内部一个接一个地定义函数吗?而且你所说的“根据变量值执行”具体是什么意思?是像 if(myValue=="doThisFunction") thisFunction() 这样吗,还是其他什么? - B''H Bi'ezras -- Boruch Hashem
2个回答

4

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

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

let current = a;

如果后来情况有所改变,您可以更新current以引用b

current = b;

无论哪种方式,您都可以像使用ab一样使用current
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">

还可以在 CodePen 上找到这个例子(很多人现在无法使用片段)。


¹ 事实上,只要你不使用对象属性来引用函数,你就一直在使用一个“变量”(更准确地说是 绑定)来引用函数。当你执行以下操作时:

function example() {
}

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


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');


使用一个对象或Map,在每次查找函数时都进行查找也是一种合理的方法,不错。我已经在片段中修复了几个拼写错误,并添加了第二个函数以增加清晰度。 - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接