7

我在使用匿名函数在 javascript 中进行分析时遇到了一个主要问题,我总是有很多匿名函数 - 其中大多数是回调 - 这使得分析分析器的结果对我来说非常困难。

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

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

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

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

4

5 回答 5

10

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

但在 IE 8 及更低版本中存在问题。它会泄漏到外部范围,并且实际上会创建一个不同的函数对象,所以如果这是一个问题,你应该取消它。

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

有关更多信息,请参阅本文:命名函数表达式揭秘

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

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

但这有点难看。

于 2012-08-27T17:40:24.803 回答
1

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

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

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
于 2012-08-27T17:39:52.843 回答
1

你不必把事情复杂化。

声明时只需命名函数

var foo = function foo(){};
于 2012-08-27T17:41:35.710 回答
0

在范围内定义命名回调将导致它仅在该范围内可见。因此,我会得出结论,不应该有任何命名冲突。例如,以下代码按预期运行:

(function named_callback() { console.log("Callback 1"); })();
(function named_callback() { console.log("Callback 2"); })();​
于 2012-08-27T17:40:01.223 回答
0

实际上,您仍在创建匿名函数表达式并将其分配给局部范围变量f。去做

function f( callback ) {
    callback();
}

f( named_function );

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

这样,您甚至可以避免 <= IE8 中的命名函数表达式内存泄漏,此外,由于您不再创建函数表达式而是创建 *function 声明,因此您甚至可以f在主体内访问。

于 2012-08-27T17:40:34.433 回答