[英]What advantage is there to name an inlined function?
在例如。 回调,命名内联函数和匿名内联函数之间有什么区别?
我认为它增加了可读性,但还有其他优点吗?
例如。
element.addEventListener("load", function onLoad() {
// execute code
});
vs.
element.addEventListener("load", function() {
// execute code
});
编辑:我想我也可以用命名的内联函数来做到这一点
...
element.addEventListener("load", function onLoad() {
// execute code ...
element.removeEventListener("load", onLoad);
});
你可以使它递归:
document.addEventListener('mousemove', function stackOverflow() {
stackOverflow();
});
您无法使用匿名内联函数执行此操作。 不是那么容易,至少(有arguments.callee
,但它不应该再使用了)。
好吧,唯一的区别是函数的name属性将是匿名函数中的空字符串。 如果保留function onLoad()
而不是匿名函数,则属性onLoad.name将包含字符串'onLoad'。 name属性是语言的扩展(它不是ECMA标准的一部分。)
当使用诸如Firebug之类的调试器时,或者从自身递归调用相同的函数时,name属性很有用; 否则你可以跳过它。
只要您想引用该功能,它就很有用。
除了递归( 如前所述 ),您还可以将数据直接绑定到函数(因为函数是第一类对象,对吧?)。 此技术的一个有用应用可能包括memoization ,您可以通过函数保存以前计算的值,以防止以后再次重新计算值。
button.addEventListener("click", function fn() {
fn.counter = fn.counter || 0;
console.log(++fn.counter);
});
它主要用于改善Error对象中的堆栈跟踪; 因此,在错误的堆栈跟踪中,您将看到函数的实际名称而不是(匿名函数)字符串。
但是,请记住,存在一些范围和兼容性问题。 一些JavaScript环境将命名函数表达式的范围表示为Object的实例; 也就是说,它从Object.prototype继承属性。 所以你可以面对这样的问题:
var constructor= function() { return null; };
var f = function() { return constructor() };
f();
最后一行将在某些ES3 JavaScript环境中返回{},而不是null。 值得庆幸的是,ES5中没有此问题。
如果您想使其递归,您可以选择执行以下操作:
var recurs = function(){
recurs();
}
document.addEventListener('mousemove', recurs);
还有一点需要注意,内联函数(或命名函数表达式)的名称仅在函数本身中可见。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.