• 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

  • 相关阅读:
    让Editplus自动格式化js、css、html。。。
    超强JavaScript编辑器WebStorm上安装zenCoding
    魔哥Css:背景色透明,内容不透明之终极方法!兼容(不支持ie6)。
    支持二次开发的Zigbee模块(SNAP技术)
    XI Monitor Analysis
    SAP 增强方式
    查找业务对应的IDOC类型(HELP)
    POS DM 学习URL
    IDOC MSGRN
    XI 安装MS SQLSERVER JDBC 驱动
  • 原文地址:https://www.cnblogs.com/walls/p/6270738.html
Copyright © 2020-2023  润新知