3 回答
TA贡献2021条经验 获得超8个赞
对于匿名函数表达式,函数是匿名-字面上说,它没有名字。要分配给它的变量有一个名称,但是函数没有。(更新:在ES5中是这样的。截至ES 2015[又名ES6],使用匿名表达式创建的函数通常会获得真名[但不是自动标识符],然后继续读取.)
名字很有用。名称可以在堆栈跟踪、调用堆栈、断点列表等中看到。名称是一件好事,™。
(过去,您必须小心使用早期版本的IE[IE8及以下版本]中的命名函数表达式,因为它们在两个完全不同的时间错误地创建了两个完全独立的函数对象(更多在我的博客文章中)。双取]。如果您需要支持IE8[!],最好还是使用匿名函数表达式或函数声明,但避免使用命名函数表达式。)
命名函数表达式的一个关键之处是,它为函数体中的函数创建一个具有该名称的作用域内标识符:
var x = function example() {
console.log(typeof example); // "function"
};
x();
console.log(typeof example); // "undefined"
然而,到ES 2015时,许多“匿名”函数表达式创建了带有名称的函数,而各种现代JavaScript引擎在从上下文中推断名称方面相当聪明,这早于此。在ES 2015中,匿名函数表达式将生成一个名为boo..但是,即使使用ES 2015+语义,也不会创建自动标识符:
var obj = {
x: function() {
console.log(typeof x); // "undefined"
console.log(obj.x.name); // "x"
},
y: function y() {
console.log(typeof y); // "function"
console.log(obj.y.name); // "y"
}
};
obj.x();
obj.y();
var boo = function() { /*...*/ };
let
const
var
)
var obj = { boo: function() { /*...*/ }};
doSomething({ boo: function() { /*...*/ }});
(最后那两件事真的是一样的)boo
obj.boo = function() { /*...*/ }; // <== Does not get a name
TA贡献1827条经验 获得超8个赞
setTimeout(function sayMoo() { alert('MOO'); setTimeout(sayMoo, 1000);}, 1000);
setTimeout
setTimeout
arguments.callee
...
setTimeout(function () { alert('MOO'); setTimeout(arguments.callee, 1000);}, 1000);
arguments.callee
避免使用 arguments.callee()
任一种 为函数表达式指定名称或者使用函数声明,其中函数必须调用自己。
添加回答
举报