我在项目中看到了这段代码,以下代码行让我感到不安
function toggleClass(elem, c) {
var fn = hasClass(elem, c) ? removeClass : addClass;
fn(elem, c);
}
我的困惑是变量fn在第三行被调用,但它几乎不是函数。我在这里失踪了什么。
答案 0 :(得分:2)
为什么不呢。三元运算符检查条件并返回该情况的适当值。该值也可以是对函数的引用。你可以亲自试试。
您的fn
被调用,然后通过()
执行。
三元运营商这样做。如果条件返回true
,则将removeClass 的引用分配给fn
。这只是复制引用并将其放入fn
变量 - 不执行它。条件返回false
时也是如此。在此之后,当您致电fn()
时,fn
包含对函数的引用,该函数将返回三元组。它通过该引用并调用适当的函数。
function remove() {
console.log('Remove');
}
function add() {
console.log('Add');
}
function toggle(data){
var fn = data ? remove : add;
fn();
}
toggle(true);
toggle(false);

答案 1 :(得分:2)
为了便于解释,给定的代码等同于以下内容:
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中的对象,函数可以分配给变量。在当前情况下,变量为fn
。
答案 2 :(得分:1)
您甚至可以直接调用ternay的结果,因为conditional (ternary) operator ?:
会根据条件返回表达式。
(hasClass(elem, c) ? removeClass : addClass)(elem, c);
为变量分配函数(引用)是为调用此函数的第二部分选择合适函数的第一部分。
代码比标准if ... then ... else
语法短。
答案 3 :(得分:1)
我的困惑是变量fn在第三行被调用,但它几乎不是函数。我在这里失踪了什么。
函数是Javascript中的对象,使用引用复制对象。这是什么意思?
当您定义一个函数addClass
时,它会存储在一个内存位置,例如 x1001 。在这里,addClass
将保留此内存位置,并在其后跟()
从此位置选择并执行的代码。
执行var fn = addClass
时,您只是复制此引用。所以现在fn
也有 x1001 而不是实际的功能。因此,当您执行fn()
时,您可以调用必要的功能。
希望它有所帮助!