Javascript 存在参数的使用。被调用方没有好的选择?
关于arguments.callee有很多谬误,我试图了解是否存在无法用可行的ES5严格模式替代的用例 在文档中,他们使用以下代码示例: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
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
将属性添加到元素中,并且理论上存在另一个类似事件处理程序发生冲突的风险。我给出的解决方案还允许同一个函数独立于它的使用,例如在多个事件处理程序中注入:是的,我理解你的论点,但是在需要它的地方有实际的例子吗?这就是我要找的。可能是一个模板解析器和输出生成器或类似的东西。我看到的是人们争论参数。被调用方
是必要的,但没有充分的理由。仅供参考,这里是另一个使用参数的演示。被调用方
: