关于 arguments.callee 的谬论有很多,我试图理解是否存在使用 ES5严格模式 ES5严格模式无法取代的情况 em>替代。
在MDN arguments.callee文档中,他们使用以下代码示例指出a use of arguments.callee with no good alternative:
function createPerson (sIdentity) {
var oPerson = new Function("alert(arguments.callee.identity);");
oPerson.identity = sIdentity;
return oPerson;
}
var john = createPerson("John Smith");
john();
他们包含链接bug以表明在某些情况下, argument.callee 不能被符合 ES5严格模式的代码替换
但在理解中,他们用作示例的代码可以替换为以下严格模式替代方案:
"use strict";
function createPerson(sIdentity) {
var oPerson = function () {
alert(oPerson.identity);
};
oPerson.identity = sIdentity;
return oPerson;
}
var john = createPerson("John Smith");
john();
有了这个指出,确实存在一些算法,其中arguments.callee不能被替换?
BOUNTY
为了赢得赏金,我希望答案包含arguments.callee
的用法,其中使用其他解决方案会更加模糊或不可能。
在MDN示例中,我作为替代方案编写的版本不会更改该段代码的使用。
答案 0 :(得分:2)
这是一个用例:为内联事件处理程序(可能来自生成/模板化代码)保留一个变量,而不会污染全局命名空间或DOM或冒着其他名称冲突的风险:
<button onclick="var f=arguments.callee;alert(f.i=(f.i||0)+1)">CLICK</button>
现在,让我们说这不是合法用途。当然没有一个真正合法或arguments.callee
不会被砍掉。
答案 1 :(得分:0)
当你创建一个函数动态(来自字符串)时,它不能“捕获”任何外部变量,就像正常的闭包那样。
因此,MDN示例通过arguments.callee
访问值来模拟闭包。没有改变功能的签名就没有别的办法了。
答案 2 :(得分:0)
我害怕你误解了这个例子。 这意味着使用Function构造函数不存在argument.callee的替代方法 也就是说,下面的代码
function createPerson (sIdentity) {
var oPerson = new Function("alert(oPerson.identity);");
oPerson.identity = sIdentity;
return oPerson;
}
var john = createPerson("John Smith");
john();
错了