arguments.callee
callee 表示当前正在执行的函数,这个在匿名函数调用自身时很有用。
但是如果有函数名,尽量不要用 arguments.callee。
举个匿名函数使用递归的例子:
[1,2,3,4,5].map(function (n) {
return !(n > 1) ? 1 : arguments.callee(n - 1) * n;
});
通过命名函数表达式替代 callee:
[1,2,3,4,5].map(function factorial (n) {
return !(n > 1) ? 1 : factorial(n-1) * n;
});
另外使用 callee 还有个问题,递归调用会获取到一个不同的 this 值,例如:
let global = this;
let sayThis = function(recursed) {
if (!recursed) {
console.log('This is ' + this); // This is [object global]
return arguments.callee(true);
}
if (this !== global) {
console.log('This is ' + this); // This is [object Arguments]
} else {
console.log('This is global');
}
}
sayThis();
从例子中可以看出,调用 arguments.callee 后的 this 不等于首次调用 sayThis 的对象 global。所以使用 callee 可能会混淆 this,导致功能可能会出现意外的情况。
不仅不推荐用 callee,甚至不推荐用 arguments,看 arguments 的故事了解原因。
参考:
文中图片可能来自网络,侵删
Leave a comment