Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用解析器从javascript中提取私有函数_Javascript_Uglifyjs - Fatal编程技术网

使用解析器从javascript中提取私有函数

使用解析器从javascript中提取私有函数,javascript,uglifyjs,Javascript,Uglifyjs,我试图使用解析器(通过uglify js,但任何其他的都可以)从输入字符串中提取私有函数 a.js的内容 var UglifyJS = require('uglify-js'); var ast = UglifyJS.parse(require('fs').readFileSync('b.js').toString()); var stream = UglifyJS.OutputStream({}); // need to manipulate ast here to extract the

我试图使用解析器(通过uglify js,但任何其他的都可以)从输入字符串中提取私有函数

a.js的内容

var UglifyJS = require('uglify-js');
var ast = UglifyJS.parse(require('fs').readFileSync('b.js').toString());

var stream = UglifyJS.OutputStream({});

// need to manipulate ast here to extract the `sum` function
ast.print(stream)
console.log(stream+'')
var addRandom = (function() {
    function sum(x, y) {
        return x + y
    };

    return function (input) {
        return sum(input, Math.random());
    };
})();
var UglifyJS = require('uglify-js'),
    fs = require('fs');

function showPrivates(file) {

    var privates = {};

    UglifyJS.parse(fs.readFileSync(file).toString('UTF-8')).walk(new UglifyJS.TreeWalker(function(node) {
        if (node instanceof UglifyJS.AST_Defun) {
            var stream = UglifyJS.OutputStream({});
            node.print(stream);
            privates[node.name.name] = stream.toString('UTF-8');
        }
    }));

    return privates;

}

console.log(showPrivates('b.js').sum);
var addRandom = (function() {

    function sum(x, y) {
        return x + y;
    };

    function random(x) {
        return Math.floor(Math.random()*x);
    };

    return function (input) {
        return sum(input, random(10));
    };
})();
b.js的内容

var UglifyJS = require('uglify-js');
var ast = UglifyJS.parse(require('fs').readFileSync('b.js').toString());

var stream = UglifyJS.OutputStream({});

// need to manipulate ast here to extract the `sum` function
ast.print(stream)
console.log(stream+'')
var addRandom = (function() {
    function sum(x, y) {
        return x + y
    };

    return function (input) {
        return sum(input, Math.random());
    };
})();
var UglifyJS = require('uglify-js'),
    fs = require('fs');

function showPrivates(file) {

    var privates = {};

    UglifyJS.parse(fs.readFileSync(file).toString('UTF-8')).walk(new UglifyJS.TreeWalker(function(node) {
        if (node instanceof UglifyJS.AST_Defun) {
            var stream = UglifyJS.OutputStream({});
            node.print(stream);
            privates[node.name.name] = stream.toString('UTF-8');
        }
    }));

    return privates;

}

console.log(showPrivates('b.js').sum);
var addRandom = (function() {

    function sum(x, y) {
        return x + y;
    };

    function random(x) {
        return Math.floor(Math.random()*x);
    };

    return function (input) {
        return sum(input, random(10));
    };
})();
运行
节点a.js
会产生

var fn=function(){function sum(x,y){return x+y}function addRandom(input){return sum(input,Math.random())}return{addRandom:addRandom}}();
。。。但是我需要在输出之前操作ast,以提取
sum
函数。我想打印出来的是

function sum(x,y){return x+y}

如何在输出之前提取所需的AST树部分?

结果表明,使用TreeWalker是可以管理的

a.js的内容

var UglifyJS = require('uglify-js');
var ast = UglifyJS.parse(require('fs').readFileSync('b.js').toString());

var stream = UglifyJS.OutputStream({});

// need to manipulate ast here to extract the `sum` function
ast.print(stream)
console.log(stream+'')
var addRandom = (function() {
    function sum(x, y) {
        return x + y
    };

    return function (input) {
        return sum(input, Math.random());
    };
})();
var UglifyJS = require('uglify-js'),
    fs = require('fs');

function showPrivates(file) {

    var privates = {};

    UglifyJS.parse(fs.readFileSync(file).toString('UTF-8')).walk(new UglifyJS.TreeWalker(function(node) {
        if (node instanceof UglifyJS.AST_Defun) {
            var stream = UglifyJS.OutputStream({});
            node.print(stream);
            privates[node.name.name] = stream.toString('UTF-8');
        }
    }));

    return privates;

}

console.log(showPrivates('b.js').sum);
var addRandom = (function() {

    function sum(x, y) {
        return x + y;
    };

    function random(x) {
        return Math.floor(Math.random()*x);
    };

    return function (input) {
        return sum(input, random(10));
    };
})();
b.js的内容

var UglifyJS = require('uglify-js');
var ast = UglifyJS.parse(require('fs').readFileSync('b.js').toString());

var stream = UglifyJS.OutputStream({});

// need to manipulate ast here to extract the `sum` function
ast.print(stream)
console.log(stream+'')
var addRandom = (function() {
    function sum(x, y) {
        return x + y
    };

    return function (input) {
        return sum(input, Math.random());
    };
})();
var UglifyJS = require('uglify-js'),
    fs = require('fs');

function showPrivates(file) {

    var privates = {};

    UglifyJS.parse(fs.readFileSync(file).toString('UTF-8')).walk(new UglifyJS.TreeWalker(function(node) {
        if (node instanceof UglifyJS.AST_Defun) {
            var stream = UglifyJS.OutputStream({});
            node.print(stream);
            privates[node.name.name] = stream.toString('UTF-8');
        }
    }));

    return privates;

}

console.log(showPrivates('b.js').sum);
var addRandom = (function() {

    function sum(x, y) {
        return x + y;
    };

    function random(x) {
        return Math.floor(Math.random()*x);
    };

    return function (input) {
        return sum(input, random(10));
    };
})();
。。。看看

console.log(showPrivates('b.js').sum);
// function sum(x,y){return x+y}

你想提取sum来在你的脚本中使用它吗?我想从源代码中提取私有函数作为字符串值来处理。保留原始格式对我来说并不重要。我希望能够提取私有实用程序函数,并通过将它们写入中间文件进行测试。在这个问题中,我特别想知道如何根据私有函数的名称从ast树中提取任意私有函数。@仇恨者请不要在否决投票时停下来,请随意在评论中表达您的蔑视,这样我们就可以了解您需要遍历ast的错误,但是,除了以下内容之外,我找不到任何关于节点对象的有用文档:@MinusFour,这是我已经看到的页面:)也许我需要使用一个不同的解析器/格式化程序来定制输出。我自己也得出了同样的结论。这是一个很好的简洁版本,与我在自己的答案中所说的差不多。
控制台.log
应该在
顶级.walk
调用之后,否则当有多个私有函数时,它将继续输出旧函数和新函数。