Javascript 可以将三元表达式作为函数调用调用吗?

Javascript 可以将三元表达式作为函数调用调用吗?,javascript,Javascript,我在一个项目中看到了这段代码,下面几行代码让我感到不安 function toggleClass(elem, c) { var fn = hasClass(elem, c) ? removeClass : addClass; fn(elem, c); } 我的困惑是变量fn在第三行被调用,但它几乎不是一个函数。我在这里遗漏了什么。为什么不呢。三元运算符检查条件并返回该情况下的适当值。该值也可以是对函数的引用。你可以自己试试 调用您的fn,然后通过()执行它 三元运算符就是这样

我在一个项目中看到了这段代码,下面几行代码让我感到不安

function toggleClass(elem, c) {
    var fn = hasClass(elem, c) ? removeClass : addClass;
    fn(elem, c); 
}

我的困惑是变量fn在第三行被调用,但它几乎不是一个函数。我在这里遗漏了什么。

为什么不呢。三元运算符检查条件并返回该情况下的适当值。该值也可以是对函数的引用。你可以自己试试

调用您的
fn
,然后通过
()
执行它

三元运算符就是这样做的。如果条件返回
true
removeClass的引用将分配给
fn
。这只是复制引用并将其放入
fn
变量中-不执行它。当条件返回
false
时,也会执行同样的操作。在此之后,当调用
fn()
时,
fn
包含对函数的引用,该函数返回。它通过该引用调用相应的函数

函数删除(){
console.log('Remove');
}
函数add(){
console.log('Add');
}
功能切换(数据){
var fn=数据?删除:添加;
fn();
}
切换(真);

切换(假)您甚至可以直接调用ternay的结果,因为根据条件返回表达式

(hasClass(elem, c) ? removeClass : addClass)(elem, c);
将函数(引用)赋值给变量是为调用该函数的第二部分选择合适函数的第一部分

如果。。。然后。。。else
语法

我的困惑是变量fn在第三行被调用,但它几乎不是一个函数。我错过了什么

函数是Javascript中的对象,对象是使用引用复制的。这是什么意思

当您定义一个函数(比如
addClass
)时,它存储在一个内存位置(比如x1001)中。在这里,
addClass
将保存此内存位置,当其后跟
()
时,将保存从该位置拾取并执行的代码

当您执行
var fn=addClass
时,您只是在复制此引用。因此,现在
fn
也有x1001,而不是实际功能。因此,当您执行
fn()
时,可以调用必要的函数


希望有帮助

为了便于解释,给出的代码相当于以下代码:

removeClass(elem, c) {
    // removes class 'c' from element 'elem'
}

addClass(elem, c) {
    // adds class 'c' in element 'elem'
}

function toggleClass( elem, c ) {
    var fn;
    if( hasClass( elem, c ) )
        fn = removeClass;
    else
        fn = addClass;
    fn( elem, c ); 
}

函数基本上是javascript中的对象,函数可以分配给变量。在当前情况下,JavaScript中的变量是
fn

,函数是一级对象。您不需要像JavaScript中的任何其他变量一样进行特殊的传递。什么是“几乎不是函数”呢?如果不是功能,那又是什么呢?注意:如果您认为上述答案有任何错误,请在投票时一并评论。祝您今天过得愉快!非常感谢你,朋友,我想你和这里的其他人刚刚帮助我唤起了记忆。当然我很感激我认为OP的代码运行良好。他/她正在寻找解释为什么
fn
调用必需的函数。我认为OP的代码运行良好。他/她正在寻找
fn
调用必要函数的原因的解释。