Это НАСТОЯЩИЙ вызов
Я хотел бы знать, как кто-то может получить недопустимые формальные параметры в функции без объекта arguments
, чтобы имитировать, не зная формат назначения деструктуры параметров. Это не вопрос ECMAScript и относится только к JavaScript.
Ваш mySolution
не может получить доступ к arguments
или test
. Вам предоставляется массив args
, который содержит имена параметров. Вы должны вернуть объект, у которого есть свойство для каждого параметра, который является параметром, который был передан функции. Короче говоря, results[prop]
must === 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()
scope.
Например: foo.function::bar
и foo.function::['bar']
- это одно и то же foo.bar
.