我在使用匿名函数的javascript中进行性能分析时遇到了一个主要问题,我总是有很多匿名函数 - 大多数都是回调函数 - 而且我很难分析分析器的结果。
最后我决定使用命名函数进行回调,如下所示:
var f = function(callback) {
// Do something ...
callback();
}
f(function named_function() {
console.log('Sample callback function!');
});
我想知道在我的代码中进行此更改后会有任何问题吗? 并且这种类型的函数定义和传递会保留名称(named_function)吗?
答案 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
。