如何在JavaScript中将一个函数(委托?)作为参数传递给另一个函数,然后使用它?

3
我想将一个函数传递给另一个函数。我觉得这样被传递的函数被称为委托?我在网上很难找到关于这种事情的好解释。这种方法是否正确?
function getCellContentByColumnIndex = function(row, index) {
    return $(row.children().get(index)).text();
}
function naturalSort(a, b, func) {
    //...
    var $a = func(a);
    var $b = func(b);
    //...
}

//usage  
naturalSort(x, y, getCellContentByColumnIndex);
4个回答

7

您的代码:

function getCellContentByColumnIndex = function(row, index) {
    return $(row.children().get(index)).text(); 
}

这是个语法错误。以下是函数声明:

functon foo() {}

这是一个函数表达式:

var foo = function(){}

这是一个具有名称的函数表达式:

var foo = function bar(){}

这里有很多关于函数表达式和函数声明不同之处的答案,文章《具名函数表达式解密》提供了详细解释,并涵盖了许多其他方面。
"匿名函数"这个术语是指没有名称且未分配给任何东西的函数表达式,例如:
someFn( function(){...} )

someFn被调用并传递了一个没有名字的函数。它可以在someFn中分配一个名称,也可能不分配。它只能作为arguments[0]被引用。

传递函数并不是委托,这是将监听器放置在父元素上并捕获冒泡事件的术语。在某些情况下,它可以替代表格中每个单元格的点击监听器,使用表格上的单个监听器更好。

无论如何,传递函数就像传递任何其他对象一样:

function foo(){
  alert('foo');
}

function callIt(fn) {
  fn();
}

callIt(foo);  // 'foo'

在上述代码中,foo被传递给callIt并赋值给本地变量fn,然后被调用。

4
您可以像这样将函数作为变量传递:

您可以将函数作为变量传递:

var getCellContentByColumnIndex = function(row, index) {
    return $(row.children().get(index)).text();
}

function naturalSort(a, b, func) {
    //...
    var $a = func(a);
    var $b = func(b);
    //...
}

//usage  
naturalSort(x, y, getCellContentByColumnIndex);

这被称为使用匿名函数。


2
这是将函数表达式分配给变量的示例。虽然可以这样写,但最好将其作为声明来编写,因为在此处使用表达式没有任何好处。 - RobG
@RobG 在这里是正确的,确保你有一个好的理由使用它,否则更清晰的方法是简单地声明函数。 - Tom Walters

2

Anonymous functions..

var getCellContentByColumnIndex = function(row, index) {
    return $(row.children().get(index)).text();
}

你的代码中调用部分的其余内容已经完美,只需要工作即可..:)


1
在JavaScript中,函数被视为一等公民,这意味着您可以像简单变量一样随处使用它们。关键是,在引用函数时使用FunctionName,在调用函数时使用FunctionName()。
这行代码:naturalSort(x, y, getCellContentByColumnIndex); 也可以写成:
naturalSort(x, y, function (){
    return $(row.children().get(index)).text();
});

在这种情况下,它将被称为传递匿名函数

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