【发布时间】:2009-08-28 21:18:48
【问题描述】:
这是一个 SO 挑战
我想知道有人如何在没有arguments 对象的函数中获得无效的形式参数,以模拟不知道参数解构赋值的格式。这不是 ECMAScript 问题,仅与 JavaScript 有关。
您的mySolution 无法访问arguments 或test。您将获得一个包含参数名称的 args 数组。您必须返回一个对象,该对象具有每个参数的属性,该参数是传递给函数的参数。简而言之,results[prop] 必须 === test[prop]。您的解决方案不应依赖错误或安全漏洞,因为它们将来可能不会出现。我想到的这个问题的解决方案不依赖于任何错误。
(function () {
function mySolution ({
var,
this,
function,
if,
return,
true
}) {
// prohbit reference to arguments and the test object
var test = arguments = null,
args = ['var', 'this', 'function', 'if', 'return', 'true'],
results = {};
// put your solution here
return results;
};
var test = {
"var" : {},
"this" : {},
"function": {},
"if" : {},
"return" : {},
"true" : {}
},
results = mySolution(test),
pass = true;
for (var prop in test)
if (test.hasOwnProperty(prop))
if (results[prop] !== test[prop])
pass = false;
alert(pass ? "PASS" : "FAIL")
}());
这是我会接受的两种可能的解决方案之一:
(function () {
function mySolution ({
var,
this,
function,
if,
return,
true
}) {
// prohbit reference to arguments and the test object
var test = arguments = null,
args = ['var', 'this', 'function', 'if', 'return', 'true'],
results = {};
var i = args.length;
while (i--) {
results[args[i]] = eval("function::" + args[i]);
// function::[args[i]] won't work unless you eval() it
}
return results;
};
var test = {
"var" : {},
"this" : {},
"function": {},
"if" : {},
"return" : {},
"true" : {}
},
results = mySolution(test),
pass = true;
for (var prop in test)
if (test.hasOwnProperty(prop))
if (results[prop] !== test[prop])
pass = false;
alert(pass ? "PASS" : "FAIL")
}());
该解决方案通过使用默认的 function:: 命名空间和 eval() 范围来工作。
例如:foo.function::bar 和 foo.function::['bar'] 是同一事物 foo.bar。
【问题讨论】:
-
我什至不知道你可以定义这样的函数:function f({a, b, c})!这是怎么回事?
-
@nickf:这是JavaScript 1.7 解构任务的一部分。
-
我不太了解'function::'这件事。会很高兴阅读有关此的内容。顺便说一句,很棒的问题。
-
Ashish:你会很难处理它,因为它没有在任何地方记录。哎呀,我想我是唯一一个在 MDC 上做过这么多事情甚至提到它的人。 E4X 规范中没有提到 function:: 命名空间。它的主要用途是向 XML.prototype 添加方法。
XML.prototype.x = myFunc不起作用,但XML.prototype.function::x = myFunc起作用。 -
Ashish:如果您想了解更多信息,我有一篇关于 JavaScript 1.6+ 中的属性命名空间的博文,您可能想阅读:eligrey.com/blog/post/namespacing-properties-in-javascript
标签: javascript parameters