Синтаксис function[i](){}
подразумевает объект со значениями свойств, которые являются функциями, function[]
, проиндексированными по имени, [i]
.
Таким образом
{"f:1":function(){}, "f:2":function(){}, "f:A":function(){}, ... } ["f:"+i]
.
{"f:1":function f1(){}, "f:2":function f2(){}, "f:A":function fA(){}} ["f:"+i]
сохранит идентификацию имени функции. См. Примечания ниже относительно :
.
Итак,
javascript: alert(
new function(a){
this.f={"instance:1":function(){}, "instance:A":function(){}} ["instance:"+a]
}("A") . toSource()
);
отображает ({f:(function () {})})
в FireFox.
(Это почти та же идея, что и в этом решении , только он использует универсальный объект и больше не заполняет объект окна напрямую функциями.)
Этот метод явно заполняет среду instance:x
.
javascript: alert(
new function(a){
this.f=eval("instance:"+a+"="+function(){})
}("A") . toSource()
);
alert(eval("instance:A"));
показывает
({f:(function () {})})
и
function () {
}
Хотя функция свойства f
ссылается на anonymous function
, а не instance:x
, этот метод позволяет избежать нескольких проблем с этим решением .
javascript: alert(
new function(a){
eval("this.f=function instance"+a+"(){}")
}("A") . toSource()
);
alert(instanceA); /* is undefined outside the object context */
отображает только
({f:(function instanceA() {})})
- Встроенный
:
делает JavaScript function instance:a(){}
недействительным.
- Вместо ссылки фактическое определение текста функции анализируется и интерпретируется как
eval
.
Следующее не обязательно проблематично,
- Функция
instanceA
недоступна для использования как instanceA()
и так намного больше соответствует исходному контексту проблемы.
Учитывая эти соображения,
this.f = {"instance:1": function instance1(){},
"instance:2": function instance2(){},
"instance:A": function instanceA(){},
"instance:Z": function instanceZ(){}
} [ "instance:" + a ]
поддерживает глобальную вычислительную среду с максимально возможной семантикой и синтаксисом примера OP.