Ash*_*hra 6 javascript c# regex winjs visual-studio-2012
我正在使用JavaScript在Windows 8.1 App中创建一个实时编辑器.几乎完成了,但问题是每当我运行这样的坏循环或功能,然后它会自动挂起或退出.
我用一个循环测试它,如:(它只是一个例子 - 用户可以用自己的方式编写它的循环..)
for(i=0;i<=50000;i++)
{
for(j=0;j<5000;j++){
$('body').append('hey I am a bug<br>');
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这是任何应用程序或浏览器处理这种循环的最糟糕情况.所以在这里我希望如果用户使用这样的循环然后我如何处理它,以产生他们的输出?
或者,如果它不能保护我的应用程序的那种循环,如果它对我的应用程序是危险的,所以我提醒用户:
运行此代码段可能会导致应用崩溃!
我有一个想法是使用正则表达式检查代码,如果代码有类似于for(i=0;i<=5000;i++)上面的警告将显示,如何为此做一个正则表达式?
也可以包含C#作为后端.
遗憾的是,如果不对编辑过的代码进行深入而复杂的代码分析,您将无法完全防止错误的JavaScript杀死您的应用程序.例如,您可以使用从JavaScript构建抽象语法树的库,如果找到某些模式,则不允许代码执行.但是,可能导致无限循环的模式数量很大,因此查找起来并不简单,而且可能不够强大.
在for示例中,您可以将代码修改为:
for(i=0;!timeout() && i<=50000;i++)
{
for(j=0;!timeout() && j<5000;j++){
$('body').append('hey I am a bug<br>');
}
}
Run Code Online (Sandbox Code Playgroud)
我已经"注入"了一个你写的函数调用timeout.在那里,它需要能够检测是否应该中止循环,因为脚本已经运行了太长时间.
但是,这可能是用a编写的do-while,因此需要处理这种类型的循环.
例如在紧密循环中使用jQuery并修改DOM意味着尝试将JavaScript隔离到Web Worker的解决方案会很复杂,因为不允许直接操作DOM.它只能发送/接收"字符串"消息.
如果您使用XAML/C#WebView来托管(和构建)JavaScript编辑器,那么您可以考虑使用被调用的事件WebView.LongRunningScriptDetected.检测到长时间运行的脚本时会引发此问题,从而使主机能够在整个应用程序无响应并被终止之前终止脚本.
遗憾的是,x-ms-webview在WinJS项目中可用的控件中无法使用此相同的事件.
我的第一个解决方案是定义一个变量
startSeconds=new Date().getSeconds();。
然后,使用正则表达式,我将这段代码插入嵌套循环内。
;if(startSecond < new Date().getSeconds())break;
Run Code Online (Sandbox Code Playgroud)
因此,它所做的是每次循环运行时,它都会做两件事:
检查 startSecond 是否小于当前秒数new Date().getSeconds();。
例如,startSecond 可能是 22。new Date().getSeconds() 可能返回 24。现在,if condition成功了,因此它打破了循环。
大多数情况下,非危险循环应该运行大约 2 到 3 秒
像这样的小循环for(var i=0;i<30;i++){}将完全运行,但大循环将运行 3 到 4 秒,这是完全可以的。
我的解决方案使用您自己的 50000*5000 示例,但它不会崩溃!
现场演示:http://jsfiddle.net/nHqUj/4
我的第二个解决方案是定义两个变量start, max。
Max 应该是您愿意运行的最大循环数。示例 1000。
然后,使用正则表达式,我将这段代码插入嵌套循环内。
;start+=1;if(start>max)break;
Run Code Online (Sandbox Code Playgroud)
因此,它所做的是每次循环运行时,它都会做两件事:
将的值增加start1。
检查 start 是否大于max. 如果是,它就会打破循环。
这个解决方案也使用了你自己的50000*5000的例子,但它不会崩溃!
更新的演示:http://jsfiddle.net/nHqUj/3
我正在使用的正则表达式:(?:(for|while|do)\s*\([^\{\}]*\))\s*\{([^\{\}]+)\}
| 归档时间: |
|
| 查看次数: |
1741 次 |
| 最近记录: |