【问题标题】:Is it possible to "assign" a function to another function?是否可以将一个功能“分配”给另一个功能?
【发布时间】:2020-05-19 08:55:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • 循环内的一组函数是什么意思,比如一个接一个的函数定义?你到底是什么意思“根据变量值执行”?你的意思是像if(myValue=="doThisFunction") thisFunction(),还是别的什么?

标签: javascript function loops animation


【解决方案1】:

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">

Also on CodePen(现在很多人都无法使用 sn-ps)。


¹事实上,任何时候你不使用对象属性来引用函数,你总是使用“变量”(更准确地说,一个绑定)来引用一个功能。当你这样做时:

function example() {
}

...您正在当前范围内创建一个函数和一个引用该函数的变量。由这样的函数声明创建的变量实际上与var 变量相同。变量(varlet)、常量(const)和函数参数都是保存值的绑定,包括对函数等对象的引用。

【讨论】:

    【解决方案2】:

    不确定它是否会帮助您,但您可以尝试一下 创建一个对象,在值中保存您想要的函数,并且每个函数的键应该是输入中的值。 例如:

    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 也是一种合理的方法,很好。我已经修复了 sn-p 中的几个拼写错误,并添加了第二个函数以清楚起见。
    猜你喜欢
    • 1970-01-01
    • 2021-05-16
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多