Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 存在参数的使用。被调用方没有好的选择?_Javascript_Strict Mode - Fatal编程技术网

Javascript 存在参数的使用。被调用方没有好的选择?

Javascript 存在参数的使用。被调用方没有好的选择?,javascript,strict-mode,Javascript,Strict Mode,关于arguments.callee有很多谬误,我试图了解是否存在无法用可行的ES5严格模式替代的用例 在文档中,他们使用以下代码示例: function createPerson (sIdentity) { var oPerson = new Function("alert(arguments.callee.identity);"); oPerson.identity = sIdentity; return oPerson; } var john = createPe

关于arguments.callee有很多谬误,我试图了解是否存在无法用可行的ES5严格模式替代的用例

在文档中,他们使用以下代码示例:

function createPerson (sIdentity) {
    var oPerson = new Function("alert(arguments.callee.identity);");
    oPerson.identity = sIdentity;
    return oPerson;
}

var john = createPerson("John Smith");

john();
它们链接了一个inclusive,以表明在某些情况下,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();
有了这一点,确实存在一些无法替换参数的算法

赏金

为了赢得赏金,我希望答案包含使用
参数.callee
,在这里使用另一种解决方案会更加模糊或不可能


在MDN示例中,我作为替代方案编写的版本不会更改这段代码的用法。

当您动态(从字符串)创建函数时,它无法像普通闭包那样“捕获”任何外部变量


因此,MDN示例通过使值可通过
arguments.callee
访问来模拟闭包。如果不更改函数的签名,真的没有其他方法。

恐怕您误解了示例。 这意味着使用函数构造函数时,argument.callee没有替代方法 也就是说,下面的代码

function createPerson (sIdentity) {
    var oPerson = new Function("alert(oPerson.identity);");
    oPerson.identity = sIdentity;
    return oPerson;
}

var john = createPerson("John Smith");

john();

错误

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

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


现在,让我们说这不是一个合法的使用。当然,没有真正合法的或
参数。被调用方
不会被删除。

我只是关闭以强制使用strict。我更新了我的答案,使之更清楚一些。。。闭包是动态函数唯一无法完成的事情,因此需要
参数。被调用方
它的可能副本并不完全是副本。我正在研究是否真的需要使用
参数。被调用方
,而不是替代品。我得到的每一段代码都可以使用另一种方法,但我看到很多人都在争论对
参数的反对。被调用方
,我看不出有什么理由这样做。要使用
参数。被调用方
我们必须遍历堆栈,而且我所知道的每种语言都很慢。巧妙的使用,内联事件处理程序引入了大量的动态键入,并使浏览器经历了很多麻烦,这是不使用它们的另一个原因。使用
这个
会产生同样的结果,不是吗@SergioGarcia是的,这就是为什么我精确地定义了“不污染DOM”:使用
this
将属性添加到元素中,并且理论上存在另一个类似事件处理程序发生冲突的风险。我给出的解决方案还允许同一个函数独立于它的使用,例如在多个事件处理程序中注入:是的,我理解你的论点,但是在需要它的地方有实际的例子吗?这就是我要找的。可能是一个模板解析器和输出生成器或类似的东西。我看到的是人们争论
参数。被调用方
是必要的,但没有充分的理由。仅供参考,这里是另一个使用
参数的演示。被调用方