有一个arguments.callee的用法没有好的选择吗?

时间:2014-05-21 13:18:47

标签: javascript strict-mode

关于 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示例中,我作为替代方案编写的版本不会更改该段代码的使用。

3 个答案:

答案 0 :(得分:2)

这是一个用例:为内联事件处理程序(可能来自生成/模板化代码)保留一个变量,而不会污染全局命名空间或DOM或冒着其他名称冲突的风险:

<button onclick="var f=arguments.callee;alert(f.i=(f.i||0)+1)">CLICK</button>

Demonstration

现在,让我们说这不是合法用途。当然没有一个真正合法或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();

错了