我正在努力将一些旧代码移植到'严格模式',在ECMA5标准中,argument.callee和类似的argument.caller等的替代方法是什么?
ADDED INFO:我没有说明为什么我需要argument.caller / callee。
我正在移植的代码正在使用
assert.ok(elemNode, arguments.callee.name + ": Entity - " + entityId + " has been found");
如果它是简单的递归,我可以使用函数名称(){... function()...},但我似乎无法找到如何处理上述代码。
答案 0 :(得分:7)
从ECMAScript 3开始,您可以使用命名函数表达式。在此之前,函数表达式是匿名的,这使arguments.callee
成为必需。命名函数表达式使其不必要。所以这是推荐的替代方案。
[1,2,3,4,5].map(function factorial (n) {
return !(n > 1) ? 1 : factorial(n-1)*n;
});
答案 1 :(得分:3)
不是。
无法模仿或“ polyfill ”arguments.caller
属性,已因安全原因而被移除,因此您无法爬上去范围链,代码中。
arguments.callee
的最佳替代方法是只使用命名函数表达式,而不是匿名函数表达式,如
setTimeout(function loop() {
if( /* condition */ ) {
loop(); // instead of arguments.callee();
}
}, 1000);
在几乎所有实现中,这也更快(访问arguments
对象通常有点慢'
答案 2 :(得分:1)
您需要命名您的函数,然后只需通过该名称引用该函数。
答案 3 :(得分:0)
严格来说,没有相应的东西。作为John Resig points out,您需要在ECMAScript 5的严格模式下命名您的“匿名”函数,然后您可以直接调用它们。他的例子是:
setTimeout(function later(){
// do stuff...
setTimeout( later, 1000 );
}, 1000 );