可以有条件地解析Javascript代码?

时间:2014-08-01 20:20:00

标签: javascript parsing internet-explorer-8 interpreter

是否有可能阻止浏览器解析文件中存在的所有javascript代码(例如,咳嗽)ie8?如果从理论上讲这是可能的,我很好奇,因为实际上我的具体情况有变通方法。

这就是我的意思:

(HTML)

<!--[if lt IE 9]>
    <script type="text/javascript">
        window.browser = 'bad';
    </script>
<![endif]-->

(myfile.js,使用此代码,字面上不会在ie8中运行)

if(window.browser != 'bad')
{
    ColorSpace.singletons = {
                get gray() { //get is not correctly parse in <ie8
                    return shadow(this, 'gray', new DeviceGrayCS());
                },
                get rgb() {
                    return shadow(this, 'rgb', new DeviceRgbCS());
                },
                get cmyk() {
                    return shadow(this, 'cmyk', new DeviceCmykCS());
                }
            };
}

谢谢!

(先发制人编辑) 对于那些可能会想“等待!javascript被解释...”的人,我的回答是:首先,浏览器会进行一些初始解析,例如将其拆分为令牌,并且在此情况下令牌“get”将在代码有机会之前中断被解释,因为它是无序的

2 个答案:

答案 0 :(得分:0)

第一步;将您的脚本分成.js个文件,比如my_awesome_code.js (只是注意到您已经完成了此操作)

如果您不能认为 JavaScript 解释器会接受语法,那么保护自己的最佳方法仍然是功能检测,但这次使用最小的测试用例和try..catch

例如,要测试let

var can_use_let = false;
try {
    eval('(function () {let i = 0;})');
    can_use_let = true;

} catch (e) {
    if (console && console.warn)
        console.warn(e);
}
console.log("You " + ['can not', 'can'][+can_use_let] + " use __let__!");

此时您知道是否可以动态包含使用这些功能的<script src="my_awesome_code.js"></script>

答案 1 :(得分:0)

正如评论中所讨论的,您可以简单地将代码粘贴到浏览器不会将其视为代码的地方,稍后(ab)使用eval()。例如,使用字符串文字:

if(window.browser != 'bad')
{
    eval("ColorSpace.singletons = {\
                get gray() { //get is not correctly parse in <ie8\
                    return shadow(this, 'gray', new DeviceGrayCS());\
                },\
                get rgb() {\
                    return shadow(this, 'rgb', new DeviceRgbCS());\
                },\
                get cmyk() {\
                    return shadow(this, 'cmyk', new DeviceCmykCS());\
                }\
            };");
}

为了避免换行符和引号的笨拙反斜杠,还可以使用<script>标记,其中type属性设置为非javascript(或最好是无效的MIME)类型,或者实际上是您知道浏览器无法呈现的有效/无效HTML标记(实际上,甚至是

<div style="display:none;">code here</div>`

会这样做。稍后可以使用.innerText将此代码检索为字符串。如果你想从另一个文件远程获取它,你必须更加微妙并且动态地包含它,正如Paul的回答所示,或者有一个<script>标签来更改source属性,如下所示< / p>

<script id=customScript></script>
// ... and much, much later:
window.browser != 'bad' &&
   document.getElementById('customScript').src="path/to/my/script.js";

这是一个简短的小提示:http://jsfiddle.net/4mBBL/


eval有几个主要缺点:调试它是一场噩梦,可读性更加如此,并且每次eval()调用时代码的整体有用性都会大幅降低,因此请尽可能避免使用它。尽管如此,我们还是看到它在所有的互联网上使用了它们,而且它们都在使用了它们。