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,我们会在哪里?)但这显然是一个不同的问题.
我认为这与调用它的上下文有关eval(...)。
如果您调用eval("window.external.notify('abc');"),则应在全局上下文中调用该脚本window。
您可以按如下方式检查上下文以获取当前上下文:
eval("console.log(this); window.external.notify('abc');")
然后尝试用这三种方式进行测试,检查上下文是否有任何差异。
要指定要运行的一个上下文,您可以使用call或apply通过第一个参数设置上下文。
| 归档时间: |
|
| 查看次数: |
1744 次 |
| 最近记录: |