让我们从代码开始:
function say(name) {
var ghost=function () {
function ghost() {
alert('!');
};
return body;
};
eval("var body=''+"+name+';');
eval(name+('=('+ghost).replace('body', body)+')();');
eval(name+'();');
}
function Baal() {
if ('undefined'===typeof ghost) {
say('Baal');
return;
}
ghost();
}
say('Baal'); // or just Baal();
看起来魔鬼的名字会唤起他的存在(好吧,也许他需要某人来获得精神财产)..
正如你所看到的,幽灵并不存在Baal
,但我们可以调用它,因为eval
s 中有 s say(name)
。
say(name)
将其作为闭包重新分配Baal
给其代码体并使其捕获ghost
方法,这就是事情的工作方式。但我试图避免eval
..
所以..让我改写这个问题:
如何在不使用的情况下使不存在的(而不是成员或全局)方法可以调用eval
?