YUI Compressor压缩失效的场景-eval和with

一、官方文档的说明

in the face of evil features such as eval or with, the YUI Compressor takes a defensive approach by not obfuscating any of the scopes containing the evil statement

传送门:官方文档
翻译成中文就是说:eval和with语句所处的作用域,YUI Compressor是不进行压缩混淆单词的。

二、普通代码测试

1)源代码

function testCompressor(){
    // 测试YUI Compressor
    var person = {
            'name':'wall',
            'jser':true
        };
        
    console.log("my name is "  person.name);
}

2)压缩后重新格式化的代码

function testCompressor() {
    var a = {
        name: "wall",
        jser: true
    };
    console.log("my name is "   a.name)
};

三、含有eval代码测试

1)源代码

function testCompressor(){
    // 测试YUI Compressor
    var person = {
            'name':'wall',
            'jser':true
        };
        
    console.log("my name is "  person.name);
    eval("console.log(\"I am Jser\");");
}

2)压缩后重新格式化的代码

function testCompressor() {
    var person = {
        name: "wall",
        jser: true
    };
    console.log("my name is "   person.name);
    eval('console.log("I am Jser");')
}

结论:只要eval存在的作用域,代码都无法做混淆操作。

四、解决方案

 既然无法改变这个规则,那就要尽量去避免代码中直接出现eval。可以讲eval封装起来调用。
1)源代码

function testCompressor(){
    // 测试YUI Compressor
    var person = {
            'name':'wall',
            'jser':true
        };
        
    console.log("my name is "  person.name);
    myEval("console.log(\"I am Jser\");");
}

function myEval(data){
    return eval(data);
}

2)压缩后重新格式化的代码

function testCompressor() {
    var a = {
        name: "wall",
        jser: true
    };
    console.log("my name is "   a.name);
    myEval('console.log("I am Jser");')
}
function myEval(data) {
    return eval(data)
}

3)另一种解决方式: 改为window["eval"]进行调用

  function testCompressor(){
    // 测试YUI Compressor
    var person = {
            'name':'wall',
            'jser':true
        };
        
    console.log("my name is "  person.name);
    window["eval"]("console.log(\"I am Jser\");");
}

with 也适用上述的解决方案

原文入口:http://www.jianshu.com/p/67973651e398


更多专业前端知识,请上 【猿2048】www.mk2048.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值