使用命名函数进行回调

时间:2012-08-27 17:34:57

标签: javascript

我在使用匿名函数的javascript中进行性能分析时遇到了一个主要问题,我总是有很多匿名函数 - 大多数都是回调函数 - 而且我很难分析分析器的结果。

最后我决定使用命名函数进行回调,如下所示:

var f = function(callback) {
    // Do something ...
    callback();
}

f(function named_function() {
    console.log('Sample callback function!');
});

我想知道在我的代码中进行此更改后会有任何问题吗? 并且这种类型的函数定义和传递会保留名称(named_function)吗?

5 个答案:

答案 0 :(得分:8)

该名称仅在命名函数表达式的范围内可用。

但IE 8及更低版本存在问题。它会泄漏到外部作用域,并且实际上会创建一个不同的函数对象,因此如果这是一个问题,你应该将它置空。

f(function named_function() {
    console.log('Sample callback function!');
});
var named_function = null;

有关详细信息,请参阅此文章:Named function expressions demystified

或者您可以像这样创建它来解决IE问题。

f(function() {
    return function named_function() {
        console.log('Sample callback function!');
    };
}());

但那有点难看。

答案 1 :(得分:1)

你不必复杂化。

只需在声明时命名该功能

var foo = function foo(){};

答案 2 :(得分:0)

如果您传递这样的匿名函数,该名称将存在于函数本身内。

它不会存在于任何其他范围内。

var f = function(callback) {
    // Do something ...
    callback();
}

f(function named_function() {
    console.log(named_function); // Logs the function
    console.log('Sample callback function!');
});

console.log(named_function);​ // Error: named_function is undefined

答案 3 :(得分:0)

在作用域中定义命名回调将使其仅在该作用域中可见。因此,我的结论是不应该有任何命名冲突。例如,以下代码按预期运行:

(function named_callback() { console.log("Callback 1"); })();
(function named_callback() { console.log("Callback 2"); })();​

答案 4 :(得分:0)

实际上,您仍在创建匿名函数表达式并将其分配给本地范围的变量f。转到

function f( callback ) {
    callback();
}

f( named_function );

function named_function() {
    console.log('Sample callback function!');
}

这样,您甚至可以避免< = IE8中的命名函数表达式内存泄漏,加上因为您不再创建函数表达式而是*函数声明,您甚至可以访问正文中的f