javascript eval()失败,使用window.external.notify(),与window.alert()一起使用

Bob*_*bHy 13 javascript internet-explorer-10 windows-phone-8

在WP8上,如果我执行(1):

Microsoft.Phone.WebBrowser wb;
wb.InvokeScript("eval", "window.external.notify('abc');");
Run Code Online (Sandbox Code Playgroud)

它抛出'调用目标返回错误',未知错误,hresult 80020101.但是(2)

wb.InvokeScript("eval", "window.alert('abc');");
Run Code Online (Sandbox Code Playgroud)

工作正常,并显示消息框.

(3)

wb.InvokeScript("eval", "( function (){window.external.notify('abc');})();");
Run Code Online (Sandbox Code Playgroud)

也工作正常.

我的问题是,window.external.notify()阻止eval直接调用它是什么?它是一个函数调用,如window.alert(),因此它应该是一个有效的脚本.但是如果在1)中有一些关于未经修饰的呼叫的特殊内容,那为什么3)中的包裹呼叫有效?

我知道eval()是所有邪恶的根源,我已经阅读了与函数定义的eval()问题相关的其他SO帖子.(如果没有SO,我们会在哪里?)但这显然是一个不同的问题.

Mav*_*arn 1

我认为这与调用它的上下文有关eval(...)

如果您调用eval("window.external.notify('abc');"),则应在全局上下文中调用该脚本window

您可以按如下方式检查上下文以获取当前上下文:
eval("console.log(this); window.external.notify('abc');")

然后尝试用这三种方式进行测试,检查上下文是否有任何差异。

要指定要运行的一个上下文,您可以使用callapply通过第一个参数设置上下文。